[Libreoffice-commits] .: Branch 'feature/unitymenus-quantal' - 2 commits - vcl/inc vcl/unx

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Mon Oct 15 08:29:56 PDT 2012


 vcl/inc/unx/gtk/gtkframe.hxx      |    5 +-
 vcl/unx/gtk/window/gtkframe.cxx   |   68 +++++++++++++++++++-------------------
 vcl/unx/gtk/window/gtksalmenu.cxx |   56 ++++++++++++++++---------------
 3 files changed, 67 insertions(+), 62 deletions(-)

New commits:
commit 84d1e66ce5a6dec71d62e31c3fe650a220df0f9d
Author: Antonio Fernandez <antonio.fernandez at aentos.es>
Date:   Mon Oct 15 16:03:26 2012 +0100

    Added a hack to make "Slide Show" menu item on "Slide Show" menu work.
    
    Change-Id: I6c3865227702325e7f1545be893eb05b19c2e09f

diff --git a/vcl/unx/gtk/window/gtksalmenu.cxx b/vcl/unx/gtk/window/gtksalmenu.cxx
index 13afb2b..2dfed29 100644
--- a/vcl/unx/gtk/window/gtksalmenu.cxx
+++ b/vcl/unx/gtk/window/gtksalmenu.cxx
@@ -39,17 +39,29 @@
 
 static sal_Bool bMenuVisibility = sal_False;
 
+/*
+ * This function generates an alternative command name to avoid name collisions
+ * or to give a valid command name to certain menu items.
+ */
 static gchar* GetCommandForSpecialItem( GtkSalMenuItem* pSalMenuItem )
 {
     gchar* aCommand = NULL;
 
     sal_uInt16 nId = pSalMenuItem->mnId;
+    Menu* pMenu = pSalMenuItem->mpVCLMenu;
 
     // If item belongs to window list, generate a command with "window-(id)" format.
     if ( ( nId >= START_ITEMID_WINDOWLIST ) && ( nId <= END_ITEMID_WINDOWLIST ) )
-    {
         aCommand = g_strdup_printf( "window-%d", nId );
-    }
+    else
+        if ( pMenu )
+        {
+            rtl::OUString aMenuCommand = pMenu->GetItemCommand( nId );
+            MenuItemBits nBits = pMenu->GetItemBits( nId );
+
+            if ( aMenuCommand.equalsAscii(".uno:Presentation") && nBits == 0 )
+                aCommand = g_strdup(".uno:Presentation2");
+        }
 
     return aCommand;
 }
@@ -303,7 +315,8 @@ void GtkSalMenu::UpdateNativeMenu()
         // Convert internal values to native values.
         gboolean bChecked = ( itemChecked == sal_True ) ? TRUE : FALSE;
         gboolean bEnabled = ( itemEnabled == sal_True ) ? TRUE : FALSE;
-        gchar* aNativeCommand = g_strdup( rtl::OUStringToOString( aCommand, RTL_TEXTENCODING_UTF8 ).getStr() );
+//        gchar* aNativeCommand = g_strdup( rtl::OUStringToOString( aCommand, RTL_TEXTENCODING_UTF8 ).getStr() );
+        gchar* aNativeCommand = GetCommandForSpecialItem( pSalMenuItem );
 
         // Store current item command in command list.
         gchar *aCurrentCommand = g_lo_menu_get_command_from_item_in_section( pLOMenu, nSection, nItemPos );
@@ -316,15 +329,17 @@ void GtkSalMenu::UpdateNativeMenu()
         NativeSetAccelerator( nSection, nItemPos, nAccelKey, nAccelKey.GetName( GetFrame()->GetWindow() ) );
 
         // Some items are special, so they have different commands.
-        if ( g_strcmp0( aNativeCommand, "" ) == 0 )
+//        if ( g_strcmp0( aNativeCommand, "" ) == 0 )
+        if ( !aNativeCommand )
         {
-            gchar *aSpecialItemCmd = GetCommandForSpecialItem( pSalMenuItem );
-
-            if ( aSpecialItemCmd != NULL )
-            {
-                g_free( aNativeCommand );
-                aNativeCommand = aSpecialItemCmd;
-            }
+//            gchar *aSpecialItemCmd = GetCommandForSpecialItem( pSalMenuItem );
+            aNativeCommand = g_strdup( rtl::OUStringToOString( aCommand, RTL_TEXTENCODING_UTF8 ).getStr() );
+
+//            if ( aSpecialItemCmd != NULL )
+//            {
+//                g_free( aNativeCommand );
+//                aNativeCommand = aSpecialItemCmd;
+//            }
         }
 
         if ( g_strcmp0( aNativeCommand, "" ) != 0 && pSalMenuItem->mpSubMenu == NULL )
commit ea007a0422c18c12b4476533a985abd7f19da935
Author: Antonio Fernandez <antonio.fernandez at aentos.es>
Date:   Mon Oct 15 11:13:35 2012 +0100

    Menu is always visible now.
    
    Change-Id: Ia6153c6630af2b04f3b022051aa1f7c48e2bfc1e

diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
index 96a7399..93b043d 100644
--- a/vcl/inc/unx/gtk/gtkframe.hxx
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
@@ -226,8 +226,6 @@ class GtkSalFrame : public SalFrame
     friend void on_registrar_available (GDBusConnection*, const gchar*, const gchar*, gpointer);
     friend void on_registrar_unavailable (GDBusConnection*, const gchar*, gpointer);
     guint                           m_nWatcherId;
-    guint                           m_nMenuExportId;
-    guint                           m_nActionGroupExportId;
 
     void Init( SalFrame* pParent, sal_uLong nStyle );
     void Init( SystemParentData* pSysData );
@@ -312,6 +310,9 @@ public:
     GtkSalFrame( SalFrame* pParent, sal_uLong nStyle );
     GtkSalFrame( SystemParentData* pSysData );
 
+    guint                           m_nMenuExportId;
+    guint                           m_nActionGroupExportId;
+
     // dispatches an event, returns true if dispatched
     // and false else; if true was returned the event should
     // be swallowed
diff --git a/vcl/unx/gtk/window/gtkframe.cxx b/vcl/unx/gtk/window/gtkframe.cxx
index 7e944c6..ab8b9c1 100644
--- a/vcl/unx/gtk/window/gtkframe.cxx
+++ b/vcl/unx/gtk/window/gtkframe.cxx
@@ -521,15 +521,18 @@ static void ObjectDestroyedNotify( gpointer data )
     }
 }
 
-void ensure_dbus_setup( GdkWindow* gdkWindow, GtkSalFrame* pSalFrame )
+gboolean ensure_dbus_setup( gpointer data )
 {
+    GtkSalFrame* pSalFrame = reinterpret_cast< GtkSalFrame* >( data );
+    GdkWindow* gdkWindow = gtk_widget_get_window( pSalFrame->getWindow() );
+
     if ( gdkWindow != NULL && g_object_get_data( G_OBJECT( gdkWindow ), "g-lo-menubar" ) == NULL )
     {
         // Get a DBus session connection.
         if(!pSessionBus)
             pSessionBus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
-        if( pSessionBus == NULL )
-            return;
+        if( !pSessionBus )
+            return FALSE;
 
         // Create menu model and action group attached to this frame.
         GMenuModel* pMenuModel = G_MENU_MODEL( g_lo_menu_new() );
@@ -541,11 +544,6 @@ void ensure_dbus_setup( GdkWindow* gdkWindow, GtkSalFrame* pSalFrame )
         gchar* aDBusWindowPath = g_strdup_printf( "/window/%lu", windowId );
         gchar* aDBusMenubarPath = g_strdup_printf( "/window/%lu/menus/menubar", windowId );
 
-        // Publish the menu model and the action group.
-        SAL_INFO("vcl.unity", "exporting menu model at " << pMenuModel << " for window " << windowId);
-        pSalFrame->m_nMenuExportId = g_dbus_connection_export_menu_model (pSessionBus, aDBusMenubarPath, pMenuModel, NULL);
-        pSalFrame->m_nActionGroupExportId = g_dbus_connection_export_action_group( pSessionBus, aDBusPath, pActionGroup, NULL);
-
         // Set window properties.
         g_object_set_data_full( G_OBJECT(gdkWindow), "g-lo-menubar", pMenuModel, ObjectDestroyedNotify);
         g_object_set_data_full( G_OBJECT(gdkWindow), "g-lo-action-group", pActionGroup, ObjectDestroyedNotify);
@@ -555,10 +553,17 @@ void ensure_dbus_setup( GdkWindow* gdkWindow, GtkSalFrame* pSalFrame )
         gdk_x11_window_set_utf8_property ( gdkWindow, "_GTK_WINDOW_OBJECT_PATH", aDBusWindowPath );
         gdk_x11_window_set_utf8_property ( gdkWindow, "_GTK_MENUBAR_OBJECT_PATH", aDBusMenubarPath );
 
+        // Publish the menu model and the action group.
+        SAL_INFO("vcl.unity", "exporting menu model at " << pMenuModel << " for window " << windowId);
+        pSalFrame->m_nMenuExportId = g_dbus_connection_export_menu_model (pSessionBus, aDBusMenubarPath, pMenuModel, NULL);
+        pSalFrame->m_nActionGroupExportId = g_dbus_connection_export_action_group( pSessionBus, aDBusPath, pActionGroup, NULL);
+
         g_free( aDBusPath );
         g_free( aDBusWindowPath );
         g_free( aDBusMenubarPath );
     }
+
+    return FALSE;
 }
     
 void on_registrar_available( GDBusConnection * /*connection*/,
@@ -569,9 +574,6 @@ void on_registrar_available( GDBusConnection * /*connection*/,
     SolarMutexGuard aGuard;
 
     GtkSalFrame* pSalFrame = reinterpret_cast< GtkSalFrame* >( user_data );
-    GdkWindow* gdkWindow = gtk_widget_get_window( pSalFrame->getWindow() );
-
-    ensure_dbus_setup(gdkWindow, pSalFrame);
 
     SalMenu* pSalMenu = pSalFrame->GetMenu();
 
@@ -606,32 +608,28 @@ void on_registrar_unavailable( GDBusConnection * /*connection*/,
 
 void GtkSalFrame::EnsureAppMenuWatch()
 {
-    SolarMutexGuard aGuard;
-
-    if ( m_nWatcherId )
-        //g_bus_unwatch_name( m_nWatcherId );
-        return;
-
-
-    // Get a DBus session connection.
-    if ( pSessionBus == NULL )
+    if ( !m_nWatcherId )
     {
-        pSessionBus = g_bus_get_sync( G_BUS_TYPE_SESSION, NULL, NULL );
-
+        // Get a DBus session connection.
         if ( pSessionBus == NULL )
-            return;
-    }
+        {
+            pSessionBus = g_bus_get_sync( G_BUS_TYPE_SESSION, NULL, NULL );
+
+            if ( pSessionBus == NULL )
+                return;
+        }
 
-    // Publish the menu only if AppMenu registrar is available.
-    m_nWatcherId = g_bus_watch_name_on_connection( pSessionBus,
-                                                   "com.canonical.AppMenu.Registrar",
-                                                   G_BUS_NAME_WATCHER_FLAGS_NONE,
-                                                   on_registrar_available,
-                                                   on_registrar_unavailable,
-                                                   static_cast<GtkSalFrame*>(this),
-                                                   NULL );
+        // Publish the menu only if AppMenu registrar is available.
+        m_nWatcherId = g_bus_watch_name_on_connection( pSessionBus,
+                                                       "com.canonical.AppMenu.Registrar",
+                                                       G_BUS_NAME_WATCHER_FLAGS_NONE,
+                                                       on_registrar_available,
+                                                       on_registrar_unavailable,
+                                                       static_cast<GtkSalFrame*>(this),
+                                                       NULL );
+    }
 
-    ensure_dbus_setup( gtk_widget_get_window(GTK_WIDGET(m_pWindow)), static_cast<GtkSalFrame*>(this) );
+    ensure_dbus_setup( this );
 }
 
 GtkSalFrame::~GtkSalFrame()
@@ -1129,6 +1127,10 @@ void GtkSalFrame::Init( SalFrame* pParent, sal_uLong nStyle )
 #if !GTK_CHECK_VERSION(3,0,0)
     if( eWinType == GTK_WINDOW_TOPLEVEL )
     {
+        // Enable DBus native menu if available.
+//        ensure_dbus_setup( this );
+        EnsureAppMenuWatch();
+
         guint32 nUserTime = 0;
         if( (nStyle & (SAL_FRAME_STYLE_OWNERDRAWDECORATION|SAL_FRAME_STYLE_TOOLWINDOW)) == 0 )
         {
diff --git a/vcl/unx/gtk/window/gtksalmenu.cxx b/vcl/unx/gtk/window/gtksalmenu.cxx
index 65ee72b..13afb2b 100644
--- a/vcl/unx/gtk/window/gtksalmenu.cxx
+++ b/vcl/unx/gtk/window/gtksalmenu.cxx
@@ -244,10 +244,10 @@ void RemoveUnusedCommands( GLOActionGroup* pActionGroup, GList* pOldCommandList,
 void GtkSalMenu::UpdateNativeMenu()
 {
     SolarMutexGuard aGuard;
+
     if( !PrepUpdate() )
         return;
 
-
     Menu* pVCLMenu = mpVCLMenu;
     GLOMenu* pLOMenu = G_LO_MENU( mpMenuModel );
     GLOActionGroup* pActionGroup = G_LO_ACTION_GROUP( mpActionGroup );
@@ -431,7 +431,7 @@ void GtkSalMenu::RemoveItem( unsigned nPos )
     maItems.erase( maItems.begin() + nPos );
 }
 
-void GtkSalMenu::SetSubMenu( SalMenuItem* pSalMenuItem, SalMenu* pSubMenu, unsigned nPos )
+void GtkSalMenu::SetSubMenu( SalMenuItem* pSalMenuItem, SalMenu* pSubMenu, unsigned )
 {
     SolarMutexGuard aGuard;
     GtkSalMenuItem *pItem = static_cast< GtkSalMenuItem* >( pSalMenuItem );
@@ -455,23 +455,11 @@ void GtkSalMenu::SetFrame( const SalFrame* pFrame )
     // if we had a menu on the GtkSalMenu we have to free it as we generate a
     // full menu anyway and we might need to reuse an existing model and
     // actiongroup
-//    if(mpMenuModel)
-//    {
-//        g_object_unref(G_OBJECT(mpMenuModel));
-//        mpMenuModel = NULL;
-//    }
-
-//    if(mpActionGroup)
-//    {
-//        g_object_unref(G_OBJECT(mpActionGroup));
-//        mpActionGroup = NULL;
-//    }
     pFrameNonConst->SetMenu( this );
     mpFrame = static_cast< const GtkSalFrame* >( pFrame );
-    pFrameNonConst->EnsureAppMenuWatch();
 
     // Clean menu model and action group if needed.
-    GObject* pWindow = G_OBJECT( gtk_widget_get_window( GTK_WIDGET( pFrameNonConst->getWindow() ) ) );
+    GObject* pWindow = G_OBJECT( pFrameNonConst->getWindow() );
     GLOMenu* pMenuModel = G_LO_MENU( g_object_get_data( pWindow, "g-lo-menubar" ) );
     GLOActionGroup* pActionGroup = G_LO_ACTION_GROUP( g_object_get_data( pWindow, "g-lo-action-group" ) );
 
@@ -481,7 +469,6 @@ void GtkSalMenu::SetFrame( const SalFrame* pFrame )
     if ( pActionGroup )
         g_lo_action_group_clear( pActionGroup );
 
-
     // Generate the main menu structure.
     UpdateNativeMenu();
 }


More information about the Libreoffice-commits mailing list