vcl/inc/unx/gtk/gtksalmenu.hxx | 1 vcl/unx/gtk/window/gtkframe.cxx | 38 ++++---- vcl/unx/gtk/window/gtksalmenu.cxx | 167 +++++++++++++++++++++++++------------- 3 files changed, 131 insertions(+), 75 deletions(-)
New commits: commit 99b2842ecaeb5d551b2413d786d977d78d75e117 Author: Antonio Fernandez <antonio.fernan...@aentos.es> Date: Sat Sep 22 20:21:44 2012 +0100 All accelerators should be displayed now. Change-Id: I4599e9f23ba0b1150a3a24cb5d10736895c38891 diff --git a/vcl/inc/unx/gtk/gtksalmenu.hxx b/vcl/inc/unx/gtk/gtksalmenu.hxx index af02817..f2f1c9d 100644 --- a/vcl/inc/unx/gtk/gtksalmenu.hxx +++ b/vcl/inc/unx/gtk/gtksalmenu.hxx @@ -44,7 +44,6 @@ private: std::vector< GtkSalMenuItem* > maItems; sal_Bool mbMenuBar; - sal_Bool mbVisible; Menu* mpVCLMenu; GtkSalMenu* mpParentSalMenu; const GtkSalFrame* mpFrame; diff --git a/vcl/unx/gtk/window/gtkframe.cxx b/vcl/unx/gtk/window/gtkframe.cxx index 6c39412..39c9b8d 100644 --- a/vcl/unx/gtk/window/gtkframe.cxx +++ b/vcl/unx/gtk/window/gtkframe.cxx @@ -634,25 +634,25 @@ void GtkSalFrame::InitCommon() g_signal_connect( G_OBJECT(m_pWindow), "destroy", G_CALLBACK(signalDestroy), this ); // init members - m_pCurrentCursor = NULL; - m_nKeyModifiers = 0; - m_bFullscreen = false; - m_nState = GDK_WINDOW_STATE_WITHDRAWN; - m_nVisibility = GDK_VISIBILITY_FULLY_OBSCURED; - m_bSendModChangeOnRelease = false; - m_pIMHandler = NULL; - m_hBackgroundPixmap = None; - m_nSavedScreenSaverTimeout = 0; - m_nGSMCookie = 0; - m_nExtStyle = 0; - m_pRegion = NULL; - m_ePointerStyle = 0xffff; - m_bSetFocusOnMap = false; - m_pSalMenu = NULL; - m_nWatcherId = 0; - m_nMenuModelExportId = 0; - m_nActionGroupExportId = 0; - m_pDBusConnection = NULL; + m_pCurrentCursor = NULL; + m_nKeyModifiers = 0; + m_bFullscreen = false; + m_nState = GDK_WINDOW_STATE_WITHDRAWN; + m_nVisibility = GDK_VISIBILITY_FULLY_OBSCURED; + m_bSendModChangeOnRelease = false; + m_pIMHandler = NULL; + m_hBackgroundPixmap = None; + m_nSavedScreenSaverTimeout = 0; + m_nGSMCookie = 0; + m_nExtStyle = 0; + m_pRegion = NULL; + m_ePointerStyle = 0xffff; + m_bSetFocusOnMap = false; + m_pSalMenu = NULL; + m_nWatcherId = 0; + m_nMenuModelExportId = 0; + m_nActionGroupExportId = 0; + m_pDBusConnection = NULL; gtk_widget_set_app_paintable( m_pWindow, TRUE ); gtk_widget_set_double_buffered( m_pWindow, FALSE ); diff --git a/vcl/unx/gtk/window/gtksalmenu.cxx b/vcl/unx/gtk/window/gtksalmenu.cxx index 2273b2a..77ae927 100644 --- a/vcl/unx/gtk/window/gtksalmenu.cxx +++ b/vcl/unx/gtk/window/gtksalmenu.cxx @@ -22,12 +22,15 @@ #include <unx/gtk/gtksalmenu.hxx> -//#include <gtk/gtk.h> #include <unx/gtk/glomenu.h> #include <unx/gtk/gloactiongroup.h> #include <vcl/menu.hxx> #include <unx/gtk/gtkinst.hxx> +#if GTK_CHECK_VERSION(3,0,0) +# include <gdk/gdkkeysyms-compat.h> +#endif + #include <framework/menuconfiguration.hxx> #include <iostream> @@ -86,29 +89,85 @@ gdk_x11_window_set_utf8_property (GdkWindow *window, } } -// FIXME: Check for missing keys. Maybe translating keycodes would be safer... -rtl::OUString GetGtkKeyName( rtl::OUString keyName ) +static void KeyCodeToGdkKey ( const KeyCode& rKeyCode, guint* pGdkKeyCode, GdkModifierType *pGdkModifiers ) { - rtl::OUString aGtkKeyName(""); + if ( pGdkKeyCode == NULL || pGdkModifiers == NULL ) + return; + + // Get GDK key modifiers + GdkModifierType nModifiers = (GdkModifierType) 0; + + if ( rKeyCode.IsShift() ) + nModifiers = (GdkModifierType) ( nModifiers | GDK_SHIFT_MASK ); + + if ( rKeyCode.IsMod1() ) + nModifiers = (GdkModifierType) ( nModifiers | GDK_CONTROL_MASK ); - sal_Int32 nIndex = 0; + if ( rKeyCode.IsMod2() ) + nModifiers = (GdkModifierType) ( nModifiers | GDK_MOD1_MASK ); - do + *pGdkModifiers = nModifiers; + + // Get GDK keycode. + guint nKeyCode = 0; + + guint nCode = rKeyCode.GetCode(); + + if ( nCode >= KEY_0 && nCode <= KEY_9 ) + nKeyCode = ( nCode - KEY_0 ) + GDK_0; + else if ( nCode >= KEY_A && nCode <= KEY_Z ) + nKeyCode = ( nCode - KEY_A ) + GDK_A; + else if ( nCode >= KEY_F1 && nCode <= KEY_F26 ) + nKeyCode = ( nCode - KEY_F1 ) + GDK_F1; + else { - rtl::OUString token = keyName.getToken( 0, '+', nIndex ); - - if ( token == "Ctrl" ) { - aGtkKeyName += "<Control>"; - } else if ( token == "Alt" ) { - aGtkKeyName += "<Alt>"; - } else if ( token == "Shift" ) { - aGtkKeyName += "<Shift>"; - } else { - aGtkKeyName += token; + switch( nCode ) + { + case KEY_DOWN: nKeyCode = GDK_Down; break; + case KEY_UP: nKeyCode = GDK_Up; break; + case KEY_LEFT: nKeyCode = GDK_Left; break; + case KEY_RIGHT: nKeyCode = GDK_Right; break; + case KEY_HOME: nKeyCode = GDK_Home; break; + case KEY_END: nKeyCode = GDK_End; break; + case KEY_PAGEUP: nKeyCode = GDK_Page_Up; break; + case KEY_PAGEDOWN: nKeyCode = GDK_Page_Down; break; + case KEY_RETURN: nKeyCode = GDK_Return; break; + case KEY_ESCAPE: nKeyCode = GDK_Escape; break; + case KEY_TAB: nKeyCode = GDK_Tab; break; + case KEY_BACKSPACE: nKeyCode = GDK_BackSpace; break; + case KEY_SPACE: nKeyCode = GDK_space; break; + case KEY_INSERT: nKeyCode = GDK_Insert; break; + case KEY_DELETE: nKeyCode = GDK_Delete; break; + case KEY_ADD: nKeyCode = GDK_plus; break; + case KEY_SUBTRACT: nKeyCode = GDK_minus; break; + case KEY_MULTIPLY: nKeyCode = GDK_asterisk; break; + case KEY_DIVIDE: nKeyCode = GDK_slash; break; + case KEY_POINT: nKeyCode = GDK_period; break; + case KEY_COMMA: nKeyCode = GDK_comma; break; + case KEY_LESS: nKeyCode = GDK_less; break; + case KEY_GREATER: nKeyCode = GDK_greater; break; + case KEY_EQUAL: nKeyCode = GDK_equal; break; + case KEY_FIND: nKeyCode = GDK_Find; break; + case KEY_CONTEXTMENU: nKeyCode = GDK_Menu; break; + case KEY_HELP: nKeyCode = GDK_Help; break; + case KEY_UNDO: nKeyCode = GDK_Undo; break; + case KEY_REPEAT: nKeyCode = GDK_Redo; break; + case KEY_DECIMAL: nKeyCode = GDK_KP_Decimal; break; + case KEY_TILDE: nKeyCode = GDK_asciitilde; break; + case KEY_QUOTELEFT: nKeyCode = GDK_quoteleft; break; + case KEY_BRACKETLEFT: nKeyCode = GDK_bracketleft; break; + case KEY_BRACKETRIGHT: nKeyCode = GDK_bracketright; break; + case KEY_SEMICOLON: nKeyCode = GDK_semicolon; break; + + // Special cases + case KEY_COPY: nKeyCode = GDK_Copy; break; + case KEY_CUT: nKeyCode = GDK_Cut; break; + case KEY_PASTE: nKeyCode = GDK_Paste; break; + case KEY_OPEN: nKeyCode = GDK_Open; break; } - } while ( nIndex >= 0 ); + } - return aGtkKeyName; + *pGdkKeyCode = nKeyCode; } // AppMenu watch functions. @@ -193,9 +252,7 @@ static void on_registrar_available( GDBusConnection* /*connection*/, } // PublishMenu( gdkWindow ); -// g_idle_add_full( G_PRIORITY_HIGH_IDLE, PublishMenu, (gpointer) gdkWindow, NULL ); -// g_timeout_add_full( G_PRIORITY_HIGH, 0, PublishMenu, (gpointer) gdkWindow, NULL ); - gdk_threads_add_timeout_full( G_PRIORITY_HIGH, 0, PublishMenu, (gpointer) gdkWindow, NULL ); + g_timeout_add_full( G_PRIORITY_HIGH, 0, PublishMenu, (gpointer) gdkWindow, NULL ); bDBusIsAvailable = sal_True; @@ -203,11 +260,7 @@ static void on_registrar_available( GDBusConnection* /*connection*/, pMenuBar->SetDisplayable( sal_False ); // GenerateMenu( pSalMenu ); -// g_idle_add_full( G_PRIORITY_HIGH_IDLE, GenerateMenu, pSalMenu, NULL ); -// g_timeout_add_full( G_PRIORITY_HIGH, 0, GenerateMenu, pSalMenu, NULL ); - gdk_threads_add_timeout_full( G_PRIORITY_HIGH, 0, GenerateMenu, pSalMenu, NULL ); -// UpdateNativeMenu( pSalMenu ); -// UpdateNativeSubMenu( pSalMenu ); + g_timeout_add_full( G_PRIORITY_HIGH, 0, GenerateMenu, pSalMenu, NULL ); } } } @@ -319,18 +372,25 @@ static void NativeSetItemText( GLOMenu* pMenu, static void NativeSetAccelerator( GLOMenu* pMenu, unsigned nSection, unsigned nItemPos, - const KeyCode& /* rKeyCode */, + const KeyCode& rKeyCode, const rtl::OUString& rKeyName ) { if ( rKeyName.isEmpty() ) return; - rtl::OString aAccelerator = rtl::OUStringToOString( GetGtkKeyName( rKeyName ), RTL_TEXTENCODING_UTF8 ); + guint nKeyCode; + GdkModifierType nModifiers; + + KeyCodeToGdkKey( rKeyCode, &nKeyCode, &nModifiers ); + + gchar* aAccelerator = gtk_accelerator_name( nKeyCode, nModifiers ); gchar* aCurrentAccel = g_lo_menu_get_accelerator_from_item_in_section( pMenu, nSection, nItemPos ); - if ( aCurrentAccel == NULL && g_strcmp0( aCurrentAccel, aAccelerator.getStr() ) != 0 ) - g_lo_menu_set_accelerator_to_item_in_section ( pMenu, nSection, nItemPos, aAccelerator.getStr() ); + if ( aCurrentAccel == NULL && g_strcmp0( aCurrentAccel, aAccelerator ) != 0 ) + g_lo_menu_set_accelerator_to_item_in_section ( pMenu, nSection, nItemPos, aAccelerator ); + + g_free( aAccelerator ); if ( aCurrentAccel ) g_free( aCurrentAccel ); @@ -506,10 +566,10 @@ static void UpdateNativeSubMenu( GtkSalMenu *pMenu ) static void UpdateNativeMenu( GtkSalMenu* pMenu ) { -// if ( pMenu == NULL ) -// return; + if ( pMenu == NULL ) + return; -// UpdateNativeSubMenu( pMenu ); + UpdateNativeSubMenu( pMenu ); // for ( sal_uInt16 nItem = 0; nItem < pMenu->GetItemCount(); nItem++ ) { // GtkSalMenuItem *pSalMenuItem = pMenu->GetItemAtPos( nItem ); @@ -533,35 +593,36 @@ static void UpdateNativeMenu( GtkSalMenu* pMenu ) //// cout << "Deactivate" << endl; //// pSubmenu->GetMenu()->Deactivate(); -// UpdateNativeSubMenu( pSubmenu ); +//// UpdateNativeSubMenu( pSubmenu ); +//// UpdateNativeMenu( pSubmenu ); //// cout << "Updated" << endl; // } // } - SolarMutexGuard aGuard; +// SolarMutexGuard aGuard; - GLOMenu *pLOMenu = G_LO_MENU( pMenu->GetMenuModel() ); - GLOActionGroup * pLOActionGroup = G_LO_ACTION_GROUP( pMenu->GetActionGroup() ); +// GLOMenu *pLOMenu = G_LO_MENU( pMenu->GetMenuModel() ); +// GLOActionGroup * pLOActionGroup = G_LO_ACTION_GROUP( pMenu->GetActionGroup() ); - g_lo_menu_new_section( pLOMenu, 0, NULL ); +// g_lo_menu_new_section( pLOMenu, 0, NULL ); - for ( int i=0; i < 9; i++ ) { - gchar* menuStr = g_strdup_printf("Menu%d", i); +// for ( int i=0; i < 9; i++ ) { +// gchar* menuStr = g_strdup_printf("Menu%d", i); - g_lo_menu_insert_in_section( pLOMenu, 0, i, menuStr); +// g_lo_menu_insert_in_section( pLOMenu, 0, i, menuStr); - g_free(menuStr); +// g_free(menuStr); - GLOMenu *pLOMenu1 = g_lo_menu_new(); - g_lo_menu_set_submenu_to_item_in_section( pLOMenu, 0, i, G_MENU_MODEL( pLOMenu1 ) ); - g_lo_menu_new_section( pLOMenu1, 0, NULL ); - g_lo_menu_insert_in_section( pLOMenu1, 0, 0, "Option1" ); - g_lo_menu_insert_in_section( pLOMenu1, 0, 1, "Option2" ); - g_lo_menu_insert_in_section( pLOMenu1, 0, 2, "Option3" ); - g_lo_menu_insert_in_section( pLOMenu1, 0, 3, "Option4" ); - } +// GLOMenu *pLOMenu1 = g_lo_menu_new(); +// g_lo_menu_set_submenu_to_item_in_section( pLOMenu, 0, i, G_MENU_MODEL( pLOMenu1 ) ); +// g_lo_menu_new_section( pLOMenu1, 0, NULL ); +// g_lo_menu_insert_in_section( pLOMenu1, 0, 0, "Option1" ); +// g_lo_menu_insert_in_section( pLOMenu1, 0, 1, "Option2" ); +// g_lo_menu_insert_in_section( pLOMenu1, 0, 2, "Option3" ); +// g_lo_menu_insert_in_section( pLOMenu1, 0, 3, "Option4" ); +// } } @@ -581,7 +642,6 @@ gboolean GenerateMenu( gpointer user_data ) GtkSalMenu::GtkSalMenu( sal_Bool bMenuBar ) : mbMenuBar( bMenuBar ), - mbVisible( sal_False ), mpVCLMenu( NULL ), mpParentSalMenu( NULL ), mpFrame( NULL ), @@ -658,13 +718,10 @@ void GtkSalMenu::SetFrame( const SalFrame* pFrame ) if ( mpMenuModel == NULL && mpActionGroup == NULL ) // InitNativeMenu( ( GtkSalFrame* ) pFrame ); -// g_idle_add_full( G_PRIORITY_HIGH_IDLE, InitNativeMenu, (gpointer) pFrame, NULL ); -// g_timeout_add_full( G_PRIORITY_HIGH, 0, InitNativeMenu, (gpointer) pFrame, NULL ); - gdk_threads_add_timeout_full( G_PRIORITY_HIGH, 0, InitNativeMenu, (gpointer) pFrame, NULL ); + g_idle_add_full( G_PRIORITY_HIGH_IDLE, InitNativeMenu, (gpointer) pFrame, NULL ); else // Generate the main menu structure. GenerateMenu( this ); -// UpdateNativeMenu( this ); } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits