[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