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

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Mon Sep 10 07:30:30 PDT 2012


 vcl/inc/unx/gtk/gtkframe.hxx      |    5 +
 vcl/inc/unx/gtk/gtkinst.hxx       |    1 
 vcl/inc/unx/gtk/gtksalmenu.hxx    |    8 +-
 vcl/unx/gtk/app/gtkinst.cxx       |    5 -
 vcl/unx/gtk/window/gtkframe.cxx   |   18 ++++-
 vcl/unx/gtk/window/gtksalmenu.cxx |  134 +++++++++++++++++++++++++++++---------
 6 files changed, 134 insertions(+), 37 deletions(-)

New commits:
commit 2116d7fc02ac1c84e0e5b38ee641dd310d80ca38
Author: Antonio Fernandez <antonio.fernandez at aentos.es>
Date:   Mon Sep 10 15:29:46 2012 +0100

    Menu is now shown/hidden when needed.
    
    Change-Id: I4a5d155918f7147c3c2933fedad96d959accca61

diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
index 50258e0..cd080d0 100644
--- a/vcl/inc/unx/gtk/gtkframe.hxx
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
@@ -221,6 +221,9 @@ class GtkSalFrame : public SalFrame
     GdkRegion*                      m_pRegion;
 #endif
 
+    SalMenu*                        m_pSalMenu;
+    sal_uInt32                      m_nWatcherId;
+
     void Init( SalFrame* pParent, sal_uLong nStyle );
     void Init( SystemParentData* pSysData );
     void InitCommon();
@@ -345,7 +348,9 @@ public:
     virtual void                SetTitle( const rtl::OUString& rTitle );
     virtual void                SetIcon( sal_uInt16 nIcon );
     virtual void                SetMenu( SalMenu *pSalMenu );
+    virtual SalMenu*            GetMenu( void );
     virtual void                DrawMenuBar();
+    void                        SetWatcherId( sal_uInt32 watcherId );
 
     virtual void                SetExtendedFrameStyle( SalExtStyle nExtStyle );
     // Before the window is visible, a resize event
diff --git a/vcl/inc/unx/gtk/gtkinst.hxx b/vcl/inc/unx/gtk/gtkinst.hxx
index 5ec226e..efe8f16 100644
--- a/vcl/inc/unx/gtk/gtkinst.hxx
+++ b/vcl/inc/unx/gtk/gtkinst.hxx
@@ -146,7 +146,6 @@ public:
     void                        subtractEvent( sal_uInt16 nMask );
 
     boost::shared_ptr<vcl::unx::GtkPrintWrapper> getPrintWrapper() const;
-
   private:
     std::vector<GtkSalTimer *>  m_aTimers;
     bool                        IsTimerExpired();
diff --git a/vcl/inc/unx/gtk/gtksalmenu.hxx b/vcl/inc/unx/gtk/gtksalmenu.hxx
index 38ac784..ddb6a6b 100644
--- a/vcl/inc/unx/gtk/gtksalmenu.hxx
+++ b/vcl/inc/unx/gtk/gtksalmenu.hxx
@@ -44,21 +44,25 @@ private:
     std::vector< GtkSalMenuItem* >  maItems;
 
     sal_Bool                        mbMenuBar;
+    sal_Bool                        mbVisible;
     Menu*                           mpVCLMenu;
     GtkSalMenu*                     mpParentSalMenu;
     const GtkSalFrame*              mpFrame;
 
+    sal_uInt32                      mWatcherId;
+
     // GMenuModel and GActionGroup attributes
     GMenuModel*                     mpMenuModel;
     GActionGroup*                   mpActionGroup;
 
-    sal_Int32       GetPositionFromItem( GtkSalMenuItem* pSalMenuItem );
-    void            GetItemSectionAndPosition( unsigned nPos, unsigned *insertSection, unsigned *insertPos );
+    sal_Int32                   GetPositionFromItem( GtkSalMenuItem* pSalMenuItem );
+    void                        GetItemSectionAndPosition( unsigned nPos, unsigned *insertSection, unsigned *insertPos );
 
 public:
     GtkSalMenu( sal_Bool bMenuBar );
     virtual ~GtkSalMenu();
 
+    virtual void                SetVisibleMenuBar( sal_Bool bVisible );
     virtual sal_Bool            VisibleMenuBar();   // must return TRUE to actually DISPLAY native menu bars
                                                     // otherwise only menu messages are processed (eg, OLE on Windows)
 
diff --git a/vcl/unx/gtk/app/gtkinst.cxx b/vcl/unx/gtk/app/gtkinst.cxx
index 6c9e198..2738e20 100644
--- a/vcl/unx/gtk/app/gtkinst.cxx
+++ b/vcl/unx/gtk/app/gtkinst.cxx
@@ -521,7 +521,7 @@ SalBitmap* GtkInstance::CreateSalBitmap()
 
 SalMenu* GtkInstance::CreateMenu( sal_Bool bMenuBar, Menu* pVCLMenu )
 {
-    GtkSalMenu *pSalMenu = new GtkSalMenu( bMenuBar );
+    GtkSalMenu* pSalMenu = new GtkSalMenu( bMenuBar );
     pSalMenu->SetMenu( pVCLMenu );
 
     return static_cast<SalMenu*>( pSalMenu );
@@ -536,7 +536,8 @@ void GtkInstance::DestroyMenu( SalMenu* pMenu )
 
 SalMenuItem* GtkInstance::CreateMenuItem( const SalItemParams* pItemData )
 {
-    GtkSalMenuItem *pMenuItem = new GtkSalMenuItem( pItemData );
+    GtkSalMenuItem* pMenuItem = new GtkSalMenuItem( pItemData );
+
     return static_cast<SalMenuItem*>( pMenuItem );
 }
 
diff --git a/vcl/unx/gtk/window/gtkframe.cxx b/vcl/unx/gtk/window/gtkframe.cxx
index 36be0b2..d43371c 100644
--- a/vcl/unx/gtk/window/gtkframe.cxx
+++ b/vcl/unx/gtk/window/gtkframe.cxx
@@ -532,6 +532,9 @@ GtkSalFrame::~GtkSalFrame()
         g_object_unref( G_OBJECT( m_pForeignParent ) );
     if( m_pForeignTopLevel )
         g_object_unref( G_OBJECT( m_pForeignTopLevel) );
+
+    if ( m_nWatcherId > 0 )
+        g_bus_unwatch_name( m_nWatcherId );
 }
 
 void GtkSalFrame::moveWindow( long nX, long nY )
@@ -639,6 +642,8 @@ void GtkSalFrame::InitCommon()
     m_pRegion           = NULL;
     m_ePointerStyle     = 0xffff;
     m_bSetFocusOnMap    = false;
+    m_pSalMenu          = NULL;
+    m_nWatcherId        = 0;
 
     gtk_widget_set_app_paintable( m_pWindow, TRUE );
     gtk_widget_set_double_buffered( m_pWindow, FALSE );
@@ -1288,14 +1293,25 @@ void GtkSalFrame::SetIcon( sal_uInt16 nIcon )
     g_list_free( pIcons );
 }
 
-void GtkSalFrame::SetMenu( SalMenu* )
+void GtkSalFrame::SetMenu( SalMenu* pSalMenu )
+{
+    m_pSalMenu = pSalMenu;
+}
+
+SalMenu* GtkSalFrame::GetMenu( void )
 {
+    return m_pSalMenu;
 }
 
 void GtkSalFrame::DrawMenuBar()
 {
 }
 
+void GtkSalFrame::SetWatcherId( sal_uInt32 watcherId )
+{
+    m_nWatcherId = watcherId;
+}
+
 void GtkSalFrame::Center()
 {
     long nX, nY;
diff --git a/vcl/unx/gtk/window/gtksalmenu.cxx b/vcl/unx/gtk/window/gtksalmenu.cxx
index d6c96a4..19ca889 100644
--- a/vcl/unx/gtk/window/gtksalmenu.cxx
+++ b/vcl/unx/gtk/window/gtksalmenu.cxx
@@ -196,15 +196,97 @@ rtl::OUString GetGtkKeyName( rtl::OUString keyName )
     return aGtkKeyName;
 }
 
+// AppMenu watch functions.
+
+static sal_Bool bDBusIsAvailable = sal_False;
+
+static void
+on_registrar_available (GDBusConnection * /*connection*/,
+                        const gchar     * /*name*/,
+                        const gchar     * /*name_owner*/,
+                        gpointer         user_data)
+{
+    GtkSalFrame* pSalFrame = static_cast< GtkSalFrame* >( user_data );
+    GtkSalMenu* pSalMenu = static_cast< GtkSalMenu* >( pSalFrame->GetMenu() );
+
+    if ( pSalMenu != NULL )
+    {
+        MenuBar* pMenuBar = static_cast< MenuBar* >( pSalMenu->GetMenu() );
+
+        GtkWidget *pWidget = pSalFrame->getWindow();
+        GdkWindow *gdkWindow = gtk_widget_get_window( pWidget );
+
+        if ( gdkWindow != NULL )
+        {
+            XLIB_Window windowId = GDK_WINDOW_XID( gdkWindow );
+
+            gchar* aDBusPath = g_strdup_printf("/window/%lu", windowId);
+            gchar* aDBusWindowPath = g_strdup_printf( "/window/%lu", windowId );
+            gchar* aDBusMenubarPath = g_strdup_printf( "/window/%lu/menus/menubar", windowId );
+
+            // Get a DBus session connection.
+            GDBusConnection* pSessionBus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
+
+            if( pSessionBus == NULL )
+                return;
+
+            // Publish the menu.
+            if ( aDBusMenubarPath != NULL )
+                g_dbus_connection_export_menu_model (pSessionBus, aDBusMenubarPath, pSalMenu->GetMenuModel(), NULL);
+
+            if ( aDBusPath != NULL )
+                g_dbus_connection_export_action_group( pSessionBus, aDBusPath, pSalMenu->GetActionGroup(), NULL);
+
+            // Set window properties.
+            gdk_x11_window_set_utf8_property ( gdkWindow, "_GTK_UNIQUE_BUS_NAME", g_dbus_connection_get_unique_name( pSessionBus ) );
+            gdk_x11_window_set_utf8_property ( gdkWindow, "_GTK_APPLICATION_OBJECT_PATH", "" );
+            gdk_x11_window_set_utf8_property ( gdkWindow, "_GTK_WINDOW_OBJECT_PATH", aDBusWindowPath );
+            gdk_x11_window_set_utf8_property ( gdkWindow, "_GTK_MENUBAR_OBJECT_PATH", aDBusMenubarPath );
+
+            g_free( aDBusPath );
+            g_free( aDBusWindowPath );
+            g_free( aDBusMenubarPath );
+
+            bDBusIsAvailable = sal_True;
+            pSalMenu->SetVisibleMenuBar( sal_True );
+            pMenuBar->SetDisplayable( sal_False );
+        }
+    }
+
+    return;
+}
+
+//This is called when the registrar becomes unavailable. It shows the menubar.
+static void
+on_registrar_unavailable (GDBusConnection * /*connection*/,
+                          const gchar     * /*name*/,
+                          gpointer         user_data)
+{
+    GtkSalFrame* pSalFrame = static_cast< GtkSalFrame* >( user_data );
+    GtkSalMenu* pSalMenu = static_cast< GtkSalMenu* >( pSalFrame->GetMenu() );
+
+    if ( pSalMenu ) {
+        MenuBar* pMenuBar = static_cast< MenuBar* >( pSalMenu->GetMenu() );
+
+        bDBusIsAvailable = sal_False;
+        pSalMenu->SetVisibleMenuBar( sal_False );
+        pMenuBar->SetDisplayable( sal_True );
+    }
+
+    return;
+}
+
 /*
  * GtkSalMenu
  */
 
 GtkSalMenu::GtkSalMenu( sal_Bool bMenuBar ) :
     mbMenuBar( bMenuBar ),
+    mbVisible( sal_False ),
     mpVCLMenu( NULL ),
     mpParentSalMenu( NULL ),
     mpFrame( NULL ),
+    mWatcherId( 0 ),
     mpMenuModel( NULL ),
     mpActionGroup( NULL )
 {
@@ -215,6 +297,8 @@ GtkSalMenu::~GtkSalMenu()
     if ( mbMenuBar == sal_True ) {
         g_source_remove_by_user_data( this );
 
+        ((GtkSalFrame*) mpFrame)->SetMenu( NULL );
+
         if ( mpActionGroup ) {
             g_lo_action_group_clear( G_LO_ACTION_GROUP( mpActionGroup ) );
         }
@@ -227,9 +311,15 @@ GtkSalMenu::~GtkSalMenu()
     maItems.clear();
 }
 
+void GtkSalMenu::SetVisibleMenuBar( sal_Bool bVisible )
+{
+//    mbVisible = bVisible;
+}
+
 sal_Bool GtkSalMenu::VisibleMenuBar()
 {
-    return sal_False;
+//    return mbVisible;
+    return bDBusIsAvailable;
 }
 
 void GtkSalMenu::InsertItem( SalMenuItem* pSalMenuItem, unsigned nPos )
@@ -263,7 +353,9 @@ void GtkSalMenu::SetSubMenu( SalMenuItem* pSalMenuItem, SalMenu* pSubMenu, unsig
 
 void GtkSalMenu::SetFrame( const SalFrame* pFrame )
 {
-    mpFrame = static_cast<const GtkSalFrame*>( pFrame );
+    mpFrame = static_cast< const GtkSalFrame* >( pFrame );
+
+    ( ( GtkSalFrame* ) mpFrame )->SetMenu( this );
 
     GtkWidget *widget = GTK_WIDGET( mpFrame->getWindow() );
 
@@ -280,36 +372,16 @@ void GtkSalMenu::SetFrame( const SalFrame* pFrame )
             g_object_set_data_full( G_OBJECT( gdkWindow ), "g-lo-menubar", mpMenuModel, ObjectDestroyedNotify );
             g_object_set_data_full( G_OBJECT( gdkWindow ), "g-lo-action-group", mpActionGroup, ObjectDestroyedNotify );
 
-            XLIB_Window windowId = GDK_WINDOW_XID( gdkWindow );
-
-            gchar* aDBusPath = g_strdup_printf("/window/%lu", windowId);
-            gchar* aDBusWindowPath = g_strdup_printf( "/window/%lu", windowId );
-            gchar* aDBusMenubarPath = g_strdup_printf( "/window/%lu/menus/menubar", windowId );
+            // Publish the menu only if AppMenu registrar is available.
+            guint nWatcherId = g_bus_watch_name (G_BUS_TYPE_SESSION,
+                                           "com.canonical.AppMenu.Registrar",
+                                           G_BUS_NAME_WATCHER_FLAGS_NONE,
+                                           on_registrar_available,
+                                           on_registrar_unavailable,
+                                           (gpointer) mpFrame,
+                                           NULL);
 
-            // Get a DBus session connection.
-            GDBusConnection* pSessionBus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
-            if(!pSessionBus) puts ("Failed to get DBus session connection");
-
-            // Publish the menu.
-            if ( aDBusMenubarPath ) {
-                sal_uInt16 menubarId = g_dbus_connection_export_menu_model (pSessionBus, aDBusMenubarPath, mpMenuModel, NULL);
-                if(!menubarId) puts("Failed to export menubar");
-            }
-
-            if ( aDBusPath ) {
-                sal_uInt16 actionGroupId = g_dbus_connection_export_action_group( pSessionBus, aDBusPath, mpActionGroup, NULL);
-                if(!actionGroupId) puts("Failed to export action group");
-            }
-
-            // Set window properties.
-            gdk_x11_window_set_utf8_property ( gdkWindow, "_GTK_UNIQUE_BUS_NAME", g_dbus_connection_get_unique_name( pSessionBus ) );
-            gdk_x11_window_set_utf8_property ( gdkWindow, "_GTK_APPLICATION_OBJECT_PATH", "" );
-            gdk_x11_window_set_utf8_property ( gdkWindow, "_GTK_WINDOW_OBJECT_PATH", aDBusWindowPath );
-            gdk_x11_window_set_utf8_property ( gdkWindow, "_GTK_MENUBAR_OBJECT_PATH", aDBusMenubarPath );
-
-            g_free( aDBusPath );
-            g_free( aDBusWindowPath );
-            g_free( aDBusMenubarPath );
+            ( ( GtkSalFrame* ) mpFrame )->SetWatcherId( nWatcherId );
         }
 
         // Generate the main menu structure.


More information about the Libreoffice-commits mailing list