int additionalStyle = 0,
                     const wxString& name = wxPanelNameStr)
         : wxWindow(owner, id, pos, size,
-                   wxWANTS_CHARS | wxBORDER_NONE | additionalStyle,
+                   wxBORDER_NONE | additionalStyle,
                    name)
     {
         m_owner = owner;
     }
 
+    virtual bool AcceptsFocus() const { return false; }
+
     wxGrid *GetOwner() { return m_owner; }
 
 protected:
     void OnPaint( wxPaintEvent& event );
     void OnMouseEvent( wxMouseEvent& event );
     void OnMouseWheel( wxMouseEvent& event );
-    void OnKeyDown( wxKeyEvent& event );
-    void OnKeyUp( wxKeyEvent& );
-    void OnChar( wxKeyEvent& );
 
     DECLARE_DYNAMIC_CLASS(wxGridRowLabelWindow)
     DECLARE_EVENT_TABLE()
     void OnPaint( wxPaintEvent& event );
     void OnMouseEvent( wxMouseEvent& event );
     void OnMouseWheel( wxMouseEvent& event );
-    void OnKeyDown( wxKeyEvent& event );
-    void OnKeyUp( wxKeyEvent& );
-    void OnChar( wxKeyEvent& );
 
     DECLARE_DYNAMIC_CLASS(wxGridColLabelWindow)
     DECLARE_EVENT_TABLE()
 private:
     void OnMouseEvent( wxMouseEvent& event );
     void OnMouseWheel( wxMouseEvent& event );
-    void OnKeyDown( wxKeyEvent& event );
-    void OnKeyUp( wxKeyEvent& );
-    void OnChar( wxKeyEvent& );
     void OnPaint( wxPaintEvent& event );
 
     DECLARE_DYNAMIC_CLASS(wxGridCornerLabelWindow)
 
     void ScrollWindow( int dx, int dy, const wxRect *rect );
 
+    virtual bool AcceptsFocus() const { return true; }
+
 private:
     wxGridRowLabelWindow     *m_rowLabelWin;
     wxGridColLabelWindow     *m_colLabelWin;
     {
         if ( isSelected )
         {
-            dc.SetBrush( wxBrush(grid.GetSelectionBackground(), wxSOLID) );
+            wxColour clr;
+            if ( grid.HasFocus() )
+                clr = grid.GetSelectionBackground();
+            else
+                clr = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW);
+            dc.SetBrush( wxBrush(clr, wxSOLID) );
         }
         else
         {
     {
         if ( isSelected )
         {
-            dc.SetTextBackground( grid.GetSelectionBackground() );
+            wxColour clr;
+            if ( grid.HasFocus() )
+                clr = grid.GetSelectionBackground();
+            else
+                clr = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW);
+            dc.SetTextBackground( clr );
             dc.SetTextForeground( grid.GetSelectionForeground() );
         }
         else
     EVT_PAINT( wxGridRowLabelWindow::OnPaint )
     EVT_MOUSEWHEEL( wxGridRowLabelWindow::OnMouseWheel )
     EVT_MOUSE_EVENTS( wxGridRowLabelWindow::OnMouseEvent )
-    EVT_KEY_DOWN( wxGridRowLabelWindow::OnKeyDown )
-    EVT_KEY_UP( wxGridRowLabelWindow::OnKeyUp )
-    EVT_CHAR( wxGridRowLabelWindow::OnChar )
 END_EVENT_TABLE()
 
 wxGridRowLabelWindow::wxGridRowLabelWindow( wxGrid *parent,
     m_owner->GetEventHandler()->ProcessEvent( event );
 }
 
-// This seems to be required for wxMotif otherwise the mouse
-// cursor must be in the cell edit control to get key events
-//
-void wxGridRowLabelWindow::OnKeyDown( wxKeyEvent& event )
-{
-    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
-        event.Skip();
-}
-
-void wxGridRowLabelWindow::OnKeyUp( wxKeyEvent& event )
-{
-    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
-        event.Skip();
-}
-
-void wxGridRowLabelWindow::OnChar( wxKeyEvent& event )
-{
-    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
-        event.Skip();
-}
-
 //////////////////////////////////////////////////////////////////////
 
 IMPLEMENT_DYNAMIC_CLASS( wxGridColLabelWindow, wxWindow )
     EVT_PAINT( wxGridColLabelWindow::OnPaint )
     EVT_MOUSEWHEEL( wxGridColLabelWindow::OnMouseWheel )
     EVT_MOUSE_EVENTS( wxGridColLabelWindow::OnMouseEvent )
-    EVT_KEY_DOWN( wxGridColLabelWindow::OnKeyDown )
-    EVT_KEY_UP( wxGridColLabelWindow::OnKeyUp )
-    EVT_CHAR( wxGridColLabelWindow::OnChar )
 END_EVENT_TABLE()
 
 wxGridColLabelWindow::wxGridColLabelWindow( wxGrid *parent,
     m_owner->GetEventHandler()->ProcessEvent( event );
 }
 
-// This seems to be required for wxMotif otherwise the mouse
-// cursor must be in the cell edit control to get key events
-//
-void wxGridColLabelWindow::OnKeyDown( wxKeyEvent& event )
-{
-    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
-        event.Skip();
-}
-
-void wxGridColLabelWindow::OnKeyUp( wxKeyEvent& event )
-{
-    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
-        event.Skip();
-}
-
-void wxGridColLabelWindow::OnChar( wxKeyEvent& event )
-{
-    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
-        event.Skip();
-}
-
 //////////////////////////////////////////////////////////////////////
 
 IMPLEMENT_DYNAMIC_CLASS( wxGridCornerLabelWindow, wxWindow )
     EVT_MOUSEWHEEL( wxGridCornerLabelWindow::OnMouseWheel )
     EVT_MOUSE_EVENTS( wxGridCornerLabelWindow::OnMouseEvent )
     EVT_PAINT( wxGridCornerLabelWindow::OnPaint )
-    EVT_KEY_DOWN( wxGridCornerLabelWindow::OnKeyDown )
-    EVT_KEY_UP( wxGridCornerLabelWindow::OnKeyUp )
-    EVT_CHAR( wxGridCornerLabelWindow::OnChar )
 END_EVENT_TABLE()
 
 wxGridCornerLabelWindow::wxGridCornerLabelWindow( wxGrid *parent,
     m_owner->GetEventHandler()->ProcessEvent(event);
 }
 
-// This seems to be required for wxMotif otherwise the mouse
-// cursor must be in the cell edit control to get key events
-//
-void wxGridCornerLabelWindow::OnKeyDown( wxKeyEvent& event )
-{
-    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
-        event.Skip();
-}
-
-void wxGridCornerLabelWindow::OnKeyUp( wxKeyEvent& event )
-{
-    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
-        event.Skip();
-}
-
-void wxGridCornerLabelWindow::OnChar( wxKeyEvent& event )
-{
-    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
-        event.Skip();
-}
-
 //////////////////////////////////////////////////////////////////////
 
 IMPLEMENT_DYNAMIC_CLASS( wxGridWindow, wxWindow )
                             const wxPoint &pos,
                             const wxSize &size )
             : wxGridSubwindow(parent, id, pos, size,
-                              wxCLIP_CHILDREN, wxT("grid window") )
+                              wxWANTS_CHARS | wxCLIP_CHILDREN,
+                              wxT("grid window") )
 {
     m_owner = parent;
     m_rowLabelWin = rowLblWin;
 
 void wxGridWindow::OnFocus(wxFocusEvent& event)
 {
+    // and if we have any selection, it has to be repainted, because it
+    // uses different colour when the grid is not focused:
+    if ( m_owner->IsSelection() )
+    {
+        Refresh();
+    }
+    else
+    {
+        // NB: Note that this code is in "else" branch only because the other
+        //     branch refreshes everything and so there's no point in calling
+        //     Refresh() again, *not* because it should only be done if
+        //     !IsSelection(). If the above code is ever optimized to refresh
+        //     only selected area, this needs to be moved out of the "else"
+        //     branch so that it's always executed.
+
+        // current cell cursor {dis,re}appears on focus change:
+        const wxGridCellCoords cursorCoords(m_owner->GetGridCursorRow(),
+                                            m_owner->GetGridCursorCol());
+        const wxRect cursor =
+            m_owner->BlockToDeviceRect(cursorCoords, cursorCoords);
+        Refresh(true, &cursor);
+    }
+
     if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
         event.Skip();
 }
 
 void wxGrid::DrawCellHighlight( wxDC& dc, const wxGridCellAttr *attr )
 {
+    // don't show highlight when the grid doesn't have focus
+    if ( !HasFocus() )
+        return;
+
     int row = m_currentCellCoords.GetRow();
     int col = m_currentCellCoords.GetCol();