[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdebase/kwin
From:       Luboš Luňák <l.lunak () kde ! org>
Date:       2005-06-22 15:44:26
Message-ID: 1119455066.042899.6744.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 427993 by lunakl:

Find out what keys are mapped to Alt and Win modifiers instead of having it hardcoded.
I fail to see why anybody would want Alt bound to anything else
than Alt keys, but oh well.
BUG: 106013



 M  +4 -0      events.cpp  
 M  +51 -8     tabbox.cpp  
 M  +1 -0      tabbox.h  


--- trunk/KDE/kdebase/kwin/events.cpp #427992:427993
@@ -452,6 +452,10 @@
             if( electricBorder( e ))
                 return true;
             break;
+        case MappingNotify:
+            XRefreshKeyboardMapping( &e->xmapping );
+            tab_box->updateKeyMapping();
+            break;
         default:
             break;
         }
--- trunk/KDE/kdebase/kwin/tabbox.cpp #427992:427993
@@ -54,6 +54,7 @@
 
     no_tasks = i18n("*** No Windows ***");
     m = DesktopMode; // init variables
+    updateKeyMapping();
     reconfigure();
     reset();
     connect(&delayedShowTimer, SIGNAL(timeout()), this, SLOT(show()));
@@ -664,6 +665,10 @@
     return bAll;
     }
 
+static const int MAX_KEYSYMS = 4;
+static uint alt_keysyms[ MAX_KEYSYMS ];
+static uint win_keysyms[ MAX_KEYSYMS ];
+
 static bool areModKeysDepressed( const KKeySequence& seq )
     {
     uint rgKeySyms[10];
@@ -684,17 +689,17 @@
         }
     if( mod & KKey::ALT )
         {
-        rgKeySyms[nKeySyms++] = XK_Alt_L;
-        rgKeySyms[nKeySyms++] = XK_Alt_R;
+        for( int i = 0;
+             i < MAX_KEYSYMS && alt_keysyms[ i ] != NoSymbol;
+             ++i )
+            rgKeySyms[nKeySyms++] = alt_keysyms[ i ];
         }
     if( mod & KKey::WIN )
         {
-        // HACK: it would take a lot of code to determine whether the Win key
-        //  is associated with Super or Meta, so check for both
-        rgKeySyms[nKeySyms++] = XK_Super_L;
-        rgKeySyms[nKeySyms++] = XK_Super_R;
-        rgKeySyms[nKeySyms++] = XK_Meta_L;
-        rgKeySyms[nKeySyms++] = XK_Meta_R;
+        for( int i = 0;
+             i < MAX_KEYSYMS && win_keysyms[ i ] != NoSymbol;
+             ++i )
+            rgKeySyms[nKeySyms++] = win_keysyms[ i ];
         }
 
     return areKeySymXsDepressed( false, rgKeySyms, nKeySyms );
@@ -712,6 +717,44 @@
     return false;
     }
 
+void TabBox::updateKeyMapping()
+    {
+    const int size = 6;
+    uint keysyms[ size ] = { XK_Alt_L, XK_Alt_R, XK_Super_L, XK_Super_R, XK_Meta_L, XK_Meta_R };
+    XModifierKeymap* map = XGetModifierMapping( qt_xdisplay() );
+    int altpos = 0;
+    int winpos = 0;
+    int winmodpos = -1;
+    int winmod = KKeyNative::modX( KKey::WIN );
+    while( winmod > 0 ) // get position of the set bit in winmod
+        {
+        winmod >>= 1;
+        ++winmodpos;
+        }
+    for( int i = 0;
+         i < MAX_KEYSYMS;
+         ++i )
+        alt_keysyms[ i ] = win_keysyms[ i ] = NoSymbol;
+    for( int i = 0;
+         i < size;
+         ++i )
+        {
+        KeyCode keycode = XKeysymToKeycode( qt_xdisplay(), keysyms[ i ] );
+        for( int j = 0;
+             j < map->max_keypermod;
+             ++j )
+            {
+            if( map->modifiermap[ 3 * map->max_keypermod + j ] == keycode ) // Alt
+                if( altpos < MAX_KEYSYMS )
+                    alt_keysyms[ altpos++ ] = keysyms[ i ];
+            if( winmodpos >= 0 && map->modifiermap[ winmodpos * map->max_keypermod + j ] == keycode )
+                if( winpos < MAX_KEYSYMS )
+                    win_keysyms[ winpos++ ] = keysyms[ i ];
+            }
+        }
+    XFreeModifiermap( map );
+    }
+
 void Workspace::slotWalkThroughWindows()
     {
     if ( root != qt_xrootwin() )
--- trunk/KDE/kdebase/kwin/tabbox.h #427992:427993
@@ -53,6 +53,7 @@
         Workspace* workspace() const;
 
         void reconfigure();
+        void updateKeyMapping();
 
     protected:
         void showEvent( QShowEvent* );
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic