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

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Sat Sep 22 12:22:35 PDT 2012


 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.fernandez at 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 );
     }
 }
 


More information about the Libreoffice-commits mailing list