anchor.diff:        end;
       end;
     end;
  -
  -  Dec(MaxScrollPosition); // Don't allow scroll off the end of the list
   
     //
     // Do we need scrollable keyboard list? Only if it's greater than 75% of screen height
     //
   
  -  ScrollableView := TotalKeyboardHeight > (Screen.Height * 3 div 4);
  +  ScrollableView := TotalKeyboardHeight > (Screen.Height * 1 div 5);
     if ScrollableView then
     begin
  -    TotalKeyboardHeight := Screen.Height * 3 div 4;
  +    TotalKeyboardHeight := Screen.Height * 1 div 5;
  +
  +    // Calculate the maximum scroll
  +    TempItemHeight := 0;
  +    for i := Fmnu.Items.Count - 1 downto 0 do
  +    begin
  +      if Fmnu.Items[i] is TKeymanMenuItem then
  +      begin
  +        kmi := Fmnu.Items[i] as TKeymanMenuItem;
  +        kmi.OnMeasureItem(kmi, Canvas, ItemWidth, ItemHeight);
  +        if (kmi.CMIItemType = _mitKeyboardsList) then
  +        begin
  +          Inc(TempItemHeight, ItemHeight);
  +          if TempItemHeight > TotalKeyboardHeight - ScrollBoxHeight*2 then
  +          begin
  +            MaxScrollPosition := i + 1;
  +            Break;
  +          end;
  +        end;
  +      end;
  +    end;
     end;
   
     if not FIsKeyboardMenu then
  
positive.code:     if FSelectedItemIndex < ScrollPosition then
        ScrollPosition := FSelectedItemIndex
      else
        while FItemRects[FSelectedItemIndex].Top + FItemOffsets[FSelectedItemIndex] < 0 do
        begin
          Inc(ScrollPosition);
          RecalculateScrollPositions;
  
negative.code:   if not Assigned(Fmnu) or not Assigned(Fmnu.Items) then Exit;  // I2884
  
    case Key of
      VK_UP:
        begin
          Key := 0;
  