vcl/inc/unx/gtk/gloactiongroup.h | 27 +-- vcl/inc/unx/gtk/gtksalmenu.hxx | 19 +- vcl/unx/gtk/window/gloactiongroup.cxx | 263 +++++++++++++--------------------- vcl/unx/gtk/window/gtksalmenu.cxx | 130 ++++++---------- 4 files changed, 181 insertions(+), 258 deletions(-)
New commits: commit a8eca38fa4e5008cb3d2efcba9d2cb412645e71d Author: Antonio Fernandez <antonio.fernan...@aentos.es> Date: Thu Aug 16 22:48:54 2012 +0100 GLOActionGroup partially implemented. Menus work but no special items shown. Change-Id: I7c48fbc5763daf789e7347cfedc62f14be53c934 diff --git a/vcl/inc/unx/gtk/gloactiongroup.h b/vcl/inc/unx/gtk/gloactiongroup.h index 431b93b..a44dbaa 100644 --- a/vcl/inc/unx/gtk/gloactiongroup.h +++ b/vcl/inc/unx/gtk/gloactiongroup.h @@ -2,7 +2,6 @@ #define GLOACTIONGROUP_H #include <gio/gio.h> -//#include "gactionmap.h" G_BEGIN_DECLS @@ -39,26 +38,22 @@ struct _GLOActionGroupClass gpointer padding[12]; }; -GType g_lo_action_group_get_type (void) G_GNUC_CONST; +GType g_lo_action_group_get_type (void) G_GNUC_CONST; -GLOActionGroup * g_lo_action_group_new (void); +GLOActionGroup * g_lo_action_group_new (void); -GAction * g_lo_action_group_lookup (GLOActionGroup *group, - const gchar *action_name); +void g_lo_action_group_insert (GLOActionGroup *group, + const gchar *action_name, + gpointer action_info); -void g_lo_action_group_insert (GLOActionGroup *group, - GAction *action); +void g_lo_action_group_set_action_enabled (GLOActionGroup *group, + const gchar *action_name, + gboolean enabled); -void g_lo_action_group_remove (GLOActionGroup *group, - const gchar *action_name); +void g_lo_action_group_remove (GLOActionGroup *group, + const gchar *action_name); -// This function has been added to make current implementation of GtkSalMenu work. -void g_lo_action_group_clear (GLOActionGroup *group); - -void g_lo_action_group_add_entries (GLOActionGroup *group, - const GActionEntry *entries, - gint n_entries, - gpointer user_data); +void g_lo_action_group_clear (GLOActionGroup *group); G_END_DECLS diff --git a/vcl/inc/unx/gtk/gtksalmenu.hxx b/vcl/inc/unx/gtk/gtksalmenu.hxx index 3bffc6c..d5ee38f 100644 --- a/vcl/inc/unx/gtk/gtksalmenu.hxx +++ b/vcl/inc/unx/gtk/gtksalmenu.hxx @@ -98,6 +98,7 @@ public: virtual GMenuModel* GetCurrentSection() { return mpCurrentSection; } virtual unsigned GetItemCount() { return maItems.size(); } virtual GtkSalMenuItem* GetItemAtPos( unsigned nPos ) { return maItems[ nPos ]; } + virtual GActionGroup* GetActionGroup() { return mpActionGroup; } }; class GtkSalMenuItem : public SalMenuItem @@ -106,14 +107,16 @@ public: GtkSalMenuItem( const SalItemParams* ); virtual ~GtkSalMenuItem(); - sal_uInt16 mnId; // Item ID - sal_uInt16 mnPos; // Item position - Menu* mpVCLMenu; // VCL Menu into which this MenuItem is inserted - GtkSalMenu* mpParentMenu; // The menu in which this menu item is inserted - GtkSalMenu* mpSubMenu; // Sub menu of this item (if defined) - GMenuModel* mpParentSection; // Section where this item is added. - GLOMenuItem* mpMenuItem; // The GMenuItem - GAction* mpAction; // The GAction associated with this item + sal_uInt16 mnId; // Item ID + sal_uInt16 mnPos; // Item position + gchar* maCommand; // Item command + Menu* mpVCLMenu; // VCL Menu into which this MenuItem is inserted + GtkSalMenu* mpParentMenu; // The menu in which this menu item is inserted + GtkSalMenu* mpSubMenu; // Sub menu of this item (if defined) + GMenuModel* mpParentSection; // Section where this item is added. + GLOMenuItem* mpMenuItem; // The GMenuItem + GVariantType* mpStateType; // A GVariantType with item state type + GVariant* mpState; // A GVariant with current item state }; #endif // GTKSALMENU_HXX diff --git a/vcl/unx/gtk/window/gloactiongroup.cxx b/vcl/unx/gtk/window/gloactiongroup.cxx index 4e99712..07919d7 100644 --- a/vcl/unx/gtk/window/gloactiongroup.cxx +++ b/vcl/unx/gtk/window/gloactiongroup.cxx @@ -1,26 +1,26 @@ #include <unx/gtk/gloactiongroup.h> -//#include "gsimpleaction.h" -//#include "gactionmap.h" -//#include "gaction.h" +#include <unx/gtk/gtkinst.hxx> +#include <unx/gtk/gtkframe.hxx> +#include <unx/gtk/gtksalmenu.hxx> +#include <vcl/menu.hxx> #include <stdio.h> +#include <iostream> +using namespace std; struct _GLOActionGroupPrivate { - GHashTable *table; /* string -> GAction */ + GHashTable *table; /* string -> GtkSalMenuItem* */ }; static void g_lo_action_group_iface_init (GActionGroupInterface *); -static void g_lo_action_group_map_iface_init (GActionMapInterface *); G_DEFINE_TYPE_WITH_CODE (GLOActionGroup, g_lo_action_group, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_GROUP, - g_lo_action_group_iface_init); - G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_MAP, - g_lo_action_group_map_iface_init)) + g_lo_action_group_iface_init)); static gchar ** g_lo_action_group_list_actions (GActionGroup *group) @@ -52,28 +52,32 @@ g_lo_action_group_query_action (GActionGroup *group, GVariant **state_hint, GVariant **state) { +// printf("%s - %s\n", __FUNCTION__, action_name); + GLOActionGroup *loGroup = G_LO_ACTION_GROUP (group); - GAction *action; + GtkSalMenuItem* item_info; - action = G_ACTION( g_hash_table_lookup (loGroup->priv->table, action_name) ); + item_info = static_cast< GtkSalMenuItem* >( g_hash_table_lookup (loGroup->priv->table, action_name) ); - if (action == NULL) + if (item_info == NULL) return FALSE; - if (enabled) - *enabled = g_action_get_enabled (action); + if (enabled) { + sal_Bool bEnabled = item_info->mpVCLMenu->IsItemEnabled( item_info->mnId ); + *enabled = (bEnabled) ? TRUE : FALSE; + } if (parameter_type) - *parameter_type = g_action_get_parameter_type (action); + *parameter_type = NULL; if (state_type) - *state_type = g_action_get_state_type (action); + *state_type = item_info->mpStateType; if (state_hint) - *state_hint = g_action_get_state_hint (action); + *state_hint = NULL; if (state) - *state = g_action_get_state (action); + *state = item_info->mpState; return TRUE; } @@ -83,15 +87,25 @@ g_lo_action_group_change_state (GActionGroup *group, const gchar *action_name, GVariant *value) { - GLOActionGroup *loGroup = G_LO_ACTION_GROUP (group); - GAction *action; + if (!action_name || !value) + return; + + GLOActionGroup* lo_group = G_LO_ACTION_GROUP (group); + GtkSalMenuItem* item_info; - action = G_ACTION( g_hash_table_lookup (loGroup->priv->table, action_name) ); + item_info = static_cast<GtkSalMenuItem*>( g_hash_table_lookup (lo_group->priv->table, action_name) ); - if (action == NULL) + if (!item_info) return; - g_action_change_state (action, value); + if (!item_info->mpStateType) { + item_info->mpStateType = g_variant_type_copy(g_variant_get_type(value)); + } + + if (g_variant_is_of_type(value, item_info->mpStateType)) { + item_info->mpState = g_variant_ref_sink(value); + g_action_group_action_state_changed(group, action_name, value); + } } static void @@ -100,109 +114,76 @@ g_lo_action_group_activate (GActionGroup *group, GVariant *parameter) { GLOActionGroup *loGroup = G_LO_ACTION_GROUP (group); - GAction *action; + GtkSalMenuItem *pSalMenuItem; - action = G_ACTION( g_hash_table_lookup (loGroup->priv->table, action_name) ); + pSalMenuItem = static_cast< GtkSalMenuItem* >( g_hash_table_lookup (loGroup->priv->table, action_name) ); - if (action == NULL) + if (pSalMenuItem == NULL || pSalMenuItem->mpSubMenu ) return; - g_action_activate (action, parameter); -} - -static void -action_enabled_notify (GAction *action, - GParamSpec *pspec, - gpointer user_data) -{ - g_action_group_action_enabled_changed (G_ACTION_GROUP( user_data ), - g_action_get_name (action), - g_action_get_enabled (action)); -} - -static void -action_state_notify (GAction *action, - GParamSpec *pspec, - gpointer user_data) -{ - GVariant *value; - - value = g_action_get_state (action); - g_action_group_action_state_changed (G_ACTION_GROUP( user_data ), - g_action_get_name (action), - value); - g_variant_unref (value); -} + GTK_YIELD_GRAB(); -static void -g_lo_action_group_disconnect (gpointer key, - gpointer value, - gpointer user_data) -{ - g_signal_handlers_disconnect_by_func (value, (gpointer) action_enabled_notify, - user_data); - g_signal_handlers_disconnect_by_func (value, (gpointer) action_state_notify, - user_data); -} + const GtkSalFrame *pFrame = pSalMenuItem->mpParentMenu ? pSalMenuItem->mpParentMenu->GetFrame() : NULL; -static GAction * -g_lo_action_group_lookup_action (GActionMap *action_map, - const gchar *action_name) -{ - GLOActionGroup *loGroup = G_LO_ACTION_GROUP (action_map); - - return G_ACTION( g_hash_table_lookup (loGroup->priv->table, action_name) ); -} - -static void -g_lo_action_group_add_action (GActionMap *action_map, - GAction *action) -{ - GLOActionGroup *loGroup = G_LO_ACTION_GROUP (action_map); - const gchar *action_name; - GAction *old_action; - - action_name = g_action_get_name (action); - old_action = G_ACTION( g_hash_table_lookup (loGroup->priv->table, action_name) ); - - if (old_action != action) + if ( pFrame && !pFrame->GetParent() ) { + ((PopupMenu*) pSalMenuItem->mpVCLMenu)->SetSelectedEntry( pSalMenuItem->mnId ); + SalMenuEvent aMenuEvt( pSalMenuItem->mnId, pSalMenuItem->mpVCLMenu ); + pFrame->CallCallback( SALEVENT_MENUCOMMAND, &aMenuEvt ); + } + else if ( pSalMenuItem->mpVCLMenu ) { - if (old_action != NULL) + // if an item from submenu was selected. the corresponding Window does not exist because + // we use native popup menus, so we have to set the selected menuitem directly + // incidentally this of course works for top level popup menus, too + PopupMenu * pPopupMenu = dynamic_cast<PopupMenu *>(pSalMenuItem->mpVCLMenu); + if( pPopupMenu ) { - g_action_group_action_removed (G_ACTION_GROUP (loGroup), - action_name); - g_lo_action_group_disconnect (NULL, old_action, loGroup); + // FIXME: revise this ugly code + + // select handlers in vcl are dispatch on the original menu + // if not consumed by the select handler of the current menu + // however since only the starting menu ever came into Execute + // the hierarchy is not build up. Workaround this by getting + // the menu it should have been + + // get started from hierarchy in vcl menus + GtkSalMenu* pParentMenu = pSalMenuItem->mpParentMenu; + Menu* pCurMenu = pSalMenuItem->mpVCLMenu; + while( pParentMenu && pParentMenu->GetMenu() ) + { + pCurMenu = pParentMenu->GetMenu(); + pParentMenu = pParentMenu->GetParentSalMenu(); + } + + pPopupMenu->SetSelectedEntry( pSalMenuItem->mnId ); + pPopupMenu->ImplSelectWithStart( pCurMenu ); + } + else + { + OSL_FAIL( "menubar item without frame !" ); } - - g_signal_connect (action, "notify::enabled", - G_CALLBACK (action_enabled_notify), loGroup); - - if (g_action_get_state_type (action) != NULL) - g_signal_connect (action, "notify::state", - G_CALLBACK (action_state_notify), loGroup); - - g_hash_table_insert (loGroup->priv->table, - g_strdup (action_name), - g_object_ref (action)); - - g_action_group_action_added (G_ACTION_GROUP (loGroup), action_name); } } -static void -g_lo_action_group_remove_action (GActionMap *action_map, - const gchar *action_name) +void +g_lo_action_group_insert (GLOActionGroup *group, + const gchar *action_name, + gpointer action_info) { - GLOActionGroup *loGroup = G_LO_ACTION_GROUP (action_map); - GAction *action; + g_return_if_fail (G_IS_LO_ACTION_GROUP (group)); - action = G_ACTION( g_hash_table_lookup (loGroup->priv->table, action_name) ); + gpointer old_action; - if (action != NULL) + old_action = g_hash_table_lookup (group->priv->table, action_name); + + if (old_action != action_info) { - g_action_group_action_removed (G_ACTION_GROUP (loGroup), action_name); - g_lo_action_group_disconnect (NULL, action, loGroup); - g_hash_table_remove (loGroup->priv->table, action_name); + if (old_action != NULL) + g_action_group_action_removed (G_ACTION_GROUP (group), action_name); + + g_hash_table_insert (group->priv->table, g_strdup (action_name), action_info); + + g_action_group_action_added (G_ACTION_GROUP (group), action_name); } } @@ -211,13 +192,9 @@ g_lo_action_group_finalize (GObject *object) { GLOActionGroup *loGroup = G_LO_ACTION_GROUP (object); - g_hash_table_foreach (loGroup->priv->table, - g_lo_action_group_disconnect, - loGroup); g_hash_table_unref (loGroup->priv->table); - G_OBJECT_CLASS (g_lo_action_group_parent_class) - ->finalize (object); + G_OBJECT_CLASS (g_lo_action_group_parent_class)->finalize (object); } static void @@ -227,7 +204,7 @@ g_lo_action_group_init (GLOActionGroup *group) G_TYPE_LO_ACTION_GROUP, GLOActionGroupPrivate); group->priv->table = g_hash_table_new_full (g_str_hash, g_str_equal, - g_free, g_object_unref); + g_free, NULL ); } static void @@ -249,36 +226,23 @@ g_lo_action_group_iface_init (GActionGroupInterface *iface) iface->activate_action = g_lo_action_group_activate; } -static void -g_lo_action_group_map_iface_init (GActionMapInterface *iface) -{ - iface->add_action = g_lo_action_group_add_action; - iface->remove_action = g_lo_action_group_remove_action; - iface->lookup_action = g_lo_action_group_lookup_action; -} - GLOActionGroup * g_lo_action_group_new (void) { return G_LO_ACTION_GROUP( g_object_new (G_TYPE_LO_ACTION_GROUP, NULL) ); } -GAction * -g_lo_action_group_lookup (GLOActionGroup *group, - const gchar *action_name) -{ - g_return_val_if_fail (G_IS_LO_ACTION_GROUP (group), NULL); - - return g_action_map_lookup_action (G_ACTION_MAP (group), action_name); -} - void -g_lo_action_group_insert (GLOActionGroup *group, - GAction *action) +g_lo_action_group_set_action_enabled (GLOActionGroup *group, + const gchar *action_name, + gboolean enabled) { g_return_if_fail (G_IS_LO_ACTION_GROUP (group)); - g_action_map_add_action (G_ACTION_MAP (group), action); + g_action_group_action_enabled_changed(G_ACTION_GROUP(group), + action_name, + enabled); + } void @@ -287,38 +251,23 @@ g_lo_action_group_remove (GLOActionGroup *group, { g_return_if_fail (G_IS_LO_ACTION_GROUP (group)); - g_action_map_remove_action (G_ACTION_MAP (group), action_name); + if (action_name != NULL) + { + g_action_group_action_removed (G_ACTION_GROUP (group), action_name); + g_hash_table_remove (group->priv->table, action_name); + } } -// This function has been added to make current implementation of GtkSalMenu work. void g_lo_action_group_clear (GLOActionGroup *group) { g_return_if_fail (G_IS_LO_ACTION_GROUP (group)); - GAction *action; - GList* keys = g_hash_table_get_keys(group->priv->table); - for ( GList* list = g_list_first(keys); list; list = g_list_next(list)) { + for ( GList* list = g_list_first(keys); list; list = g_list_next(list) ) { gchar* action_name = (gchar*) list->data; - action = G_ACTION( g_hash_table_lookup (group->priv->table, action_name) ); - if (action != NULL) - { - g_action_group_action_removed (G_ACTION_GROUP (group), action_name); - g_lo_action_group_disconnect (NULL, action, group); - g_hash_table_remove (group->priv->table, action_name); - } + g_lo_action_group_remove( group, action_name ); } } - -void -g_lo_action_group_add_entries (GLOActionGroup *group, - const GActionEntry *entries, - gint n_entries, - gpointer user_data) -{ - g_action_map_add_action_entries (G_ACTION_MAP (group), entries, n_entries, user_data); -} - diff --git a/vcl/unx/gtk/window/gtksalmenu.cxx b/vcl/unx/gtk/window/gtksalmenu.cxx index b66d4d1..8467434 100644 --- a/vcl/unx/gtk/window/gtksalmenu.cxx +++ b/vcl/unx/gtk/window/gtksalmenu.cxx @@ -35,59 +35,6 @@ isSpecialSubmenu (OUString command) return FALSE; } -static void -dispatchAction (GSimpleAction *action, - GVariant *parameter, - gpointer user_data) -{ - GTK_YIELD_GRAB(); - - if ( user_data ) { - GtkSalMenuItem *pSalMenuItem = static_cast< GtkSalMenuItem* >( user_data ); - - if ( !pSalMenuItem->mpSubMenu ) { - const GtkSalFrame *pFrame = pSalMenuItem->mpParentMenu ? pSalMenuItem->mpParentMenu->GetFrame() : NULL; - - if ( pFrame && !pFrame->GetParent() ) { - ((PopupMenu*) pSalMenuItem->mpVCLMenu)->SetSelectedEntry( pSalMenuItem->mnId ); - SalMenuEvent aMenuEvt( pSalMenuItem->mnId, pSalMenuItem->mpVCLMenu ); - pFrame->CallCallback( SALEVENT_MENUCOMMAND, &aMenuEvt ); - } - else if ( pSalMenuItem->mpVCLMenu ) - { - // if an item from submenu was selected. the corresponding Window does not exist because - // we use native popup menus, so we have to set the selected menuitem directly - // incidentally this of course works for top level popup menus, too - PopupMenu * pPopupMenu = dynamic_cast<PopupMenu *>(pSalMenuItem->mpVCLMenu); - if( pPopupMenu ) - { - // FIXME: revise this ugly code - - // select handlers in vcl are dispatch on the original menu - // if not consumed by the select handler of the current menu - // however since only the starting menu ever came into Execute - // the hierarchy is not build up. Workaround this by getting - // the menu it should have been - - // get started from hierarchy in vcl menus - GtkSalMenu* pParentMenu = pSalMenuItem->mpParentMenu; - Menu* pCurMenu = pSalMenuItem->mpVCLMenu; - while( pParentMenu && pParentMenu->GetMenu() ) - { - pCurMenu = pParentMenu->GetMenu(); - pParentMenu = pParentMenu->GetParentSalMenu(); - } - - pPopupMenu->SetSelectedEntry( pSalMenuItem->mnId ); - pPopupMenu->ImplSelectWithStart( pCurMenu ); - } - else - OSL_FAIL( "menubar item without frame !" ); - } - } - } -} - void generateActions( GtkSalMenu* pMenu, GLOActionGroup* pActionGroup ) { if ( !pMenu || !pActionGroup ) @@ -96,8 +43,8 @@ void generateActions( GtkSalMenu* pMenu, GLOActionGroup* pActionGroup ) for (sal_uInt16 i = 0; i < pMenu->GetItemCount(); i++) { GtkSalMenuItem *pSalMenuItem = pMenu->GetItemAtPos( i ); - if ( pSalMenuItem->mpAction ) { - g_lo_action_group_insert( pActionGroup, pSalMenuItem->mpAction ); + if ( pSalMenuItem->maCommand ) { + g_lo_action_group_insert( pActionGroup, pSalMenuItem->maCommand, pSalMenuItem ); } generateActions( pSalMenuItem->mpSubMenu, pActionGroup ); @@ -116,6 +63,7 @@ void updateNativeMenu( GtkSalMenu* pMenu ) { if ( pSalMenuItem->mpSubMenu && pSalMenuItem->mpSubMenu->GetMenu() ) { pSalMenuItem->mpSubMenu->GetMenu()->Activate(); updateNativeMenu( pSalMenuItem->mpSubMenu ); + pSalMenuItem->mpSubMenu->GetMenu()->Deactivate(); } } } @@ -246,8 +194,6 @@ GtkSalMenu::GtkSalMenu( sal_Bool bMenuBar ) : maSections.push_back( mpCurrentSection ); if (bMenuBar) { -// mpActionGroup = G_ACTION_GROUP( g_lo_action_group_new() ); - pSessionBus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); if(!pSessionBus) puts ("Fail bus get"); } else { @@ -317,7 +263,14 @@ void GtkSalMenu::RemoveItem( unsigned nPos ) // if ( nPos < maItems.size() ) { // GtkSalMenuItem* pSalMenuItem = maItems[ nPos ]; -// g_lo_menu_remove( G_LO_MENU( pSalMenuItem->mpParentSection ), pSalMenuItem->mnPos ); +// if ( pSalMenuItem->mpParentSection ) { +// g_lo_menu_remove( G_LO_MENU( pSalMenuItem->mpParentSection ), pSalMenuItem->mnPos ); +// } + +// if ( mpActionGroup ) { +// g_lo_action_group_remove( G_LO_ACTION_GROUP( mpActionGroup ), pSalMenuItem->maCommand ); +// } + // maItems.erase( maItems.begin() + nPos, maItems.begin() + nPos ); // } } @@ -397,18 +350,33 @@ const GtkSalFrame* GtkSalMenu::GetFrame() const void GtkSalMenu::CheckItem( unsigned nPos, sal_Bool bCheck ) { + if ( mpActionGroup ) { + GtkSalMenuItem* pSalMenuItem = maItems[ nPos ]; + MenuItemBits itemBits = pSalMenuItem->mpVCLMenu->GetItemBits( pSalMenuItem->mnId ); + + GVariant *pCheckValue = NULL; + + if ( itemBits & MIB_CHECKABLE ) { + gboolean bCheckedValue = ( bCheck == sal_True ) ? TRUE : FALSE; + pCheckValue = g_variant_new_boolean( bCheckedValue ); + } + + g_action_group_change_action_state( mpActionGroup, pSalMenuItem->maCommand, pCheckValue ); + } } void GtkSalMenu::EnableItem( unsigned nPos, sal_Bool bEnable ) { - sal_uInt16 itemId = mpVCLMenu->GetItemId( nPos ); +// if ( mpActionGroup ) { +// sal_uInt16 itemId = mpVCLMenu->GetItemId( nPos ); - GtkSalMenuItem *pSalMenuItem = GetSalMenuItem( itemId ); +// GtkSalMenuItem *pSalMenuItem = GetSalMenuItem( itemId ); - if ( pSalMenuItem && pSalMenuItem->mpAction ) { - gboolean bItemEnabled = (bEnable == sal_True) ? TRUE : FALSE; - g_simple_action_set_enabled( G_SIMPLE_ACTION( pSalMenuItem->mpAction ), bItemEnabled ); - } +// if ( pSalMenuItem ) { +// gboolean bItemEnabled = (bEnable == sal_True) ? TRUE : FALSE; +// g_lo_action_group_set_action_enabled( G_LO_ACTION_GROUP( mpActionGroup ), pSalMenuItem->maCommand, bItemEnabled ); +// } +// } } void GtkSalMenu::SetItemText( unsigned nPos, SalMenuItem* pSalMenuItem, const rtl::OUString& rText ) @@ -454,23 +422,22 @@ void GtkSalMenu::SetItemCommand( unsigned nPos, SalMenuItem* pSalMenuItem, const GtkSalMenuItem* pGtkSalMenuItem = static_cast< GtkSalMenuItem* >( pSalMenuItem ); if ( pGtkSalMenuItem && pGtkSalMenuItem->mpMenuItem ) { - if ( pGtkSalMenuItem->mpAction ) { - g_object_unref( pGtkSalMenuItem->mpAction ); - pGtkSalMenuItem->mpAction = NULL; - } - rtl::OString aOCommandStr = rtl::OUStringToOString( aCommandStr, RTL_TEXTENCODING_UTF8 ); - GSimpleAction *pAction = g_simple_action_new( aOCommandStr.getStr(), NULL ); + if ( pGtkSalMenuItem->maCommand ) + g_free( pGtkSalMenuItem->maCommand ); - // if ( !pGtkSalMenuItem->mpVCLMenu->GetPopupMenu( pGtkSalMenuItem->mnId ) ) { - g_signal_connect(pAction, "activate", G_CALLBACK( dispatchAction ), pGtkSalMenuItem); - // } + pGtkSalMenuItem->maCommand = g_strdup( aOCommandStr.getStr() ); + + if ( !pGtkSalMenuItem->mpVCLMenu->GetPopupMenu( pGtkSalMenuItem->mnId ) && mpActionGroup ) { + g_lo_action_group_insert( G_LO_ACTION_GROUP( mpActionGroup ), pGtkSalMenuItem->maCommand, pGtkSalMenuItem ); + } - pGtkSalMenuItem->mpAction = G_ACTION( pAction ); + gchar* aItemCommand = g_strconcat("win.", pGtkSalMenuItem->maCommand, NULL ); - rtl::OString aItemCommand = "win." + aOCommandStr; - g_lo_menu_item_set_action_and_target( pGtkSalMenuItem->mpMenuItem, aItemCommand.getStr(), NULL ); + g_lo_menu_item_set_action_and_target( pGtkSalMenuItem->mpMenuItem, aItemCommand, NULL ); + + g_free( aItemCommand ); if ( pGtkSalMenuItem->mpParentSection ) { g_lo_menu_remove( G_LO_MENU( pGtkSalMenuItem->mpParentSection ), pGtkSalMenuItem->mnPos ); @@ -498,14 +465,22 @@ void GtkSalMenu::Freeze() GtkSalMenuItem::GtkSalMenuItem( const SalItemParams* pItemData ) : mnId( pItemData->nId ), mnPos( 0 ), + maCommand( NULL ), mpVCLMenu( pItemData->pMenu ), mpParentMenu( NULL ), mpSubMenu( NULL ), mpMenuItem( NULL ), - mpAction( NULL ) + mpStateType( NULL ), + mpState( NULL ) { if ( pItemData->eType != MENUITEM_SEPARATOR ) { mpMenuItem = g_lo_menu_item_new( "EMPTY STRING", NULL ); + + maCommand = g_strdup( rtl::OUStringToOString( mpVCLMenu->GetItemCommand( mnId ), RTL_TEXTENCODING_UTF8 ).getStr() ); + gchar* aActionCommand = g_strconcat( "win.", maCommand, NULL ); + g_lo_menu_item_set_action_and_target( mpMenuItem, aActionCommand, NULL ); + + g_free( aActionCommand ); } } @@ -513,5 +488,6 @@ GtkSalMenuItem::~GtkSalMenuItem() { if ( mpMenuItem ) { g_object_unref( mpMenuItem ); + g_free( maCommand ); } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits