Repository: pwr-Solaar/Solaar

Issue:
Unable to see/scroll to bottom of UI with a lot of options and a small screen
**Information**
- Solaar version 1.1.4
- Distribution: Devuan GNU/Linux 4 (chimaera) - though am using Solaar from GitHub repository
- Kernel version (ex. `uname -srmo`): `Linux 5.10.0-17-rt-amd64 x86_64 GNU/Linux`
- Output of `solaar show`:

<details>


```
Solaar version 1.1.4

Unifying Receiver
  Device path  : /dev/hidraw0
  USB id       : 046d:C52B
  Serial       : 17B09D54
    Firmware   : 12.10.B0032
    Bootloader : 02.15
    Other      : AA.AA
  Has 4 paired device(s) out of a maximum of 6.
  Notifications: wireless, software present (0x000900)
  Device activity counters: 2=135, 3=153

  1: Wireless Mouse M175
     Device path  : /dev/hidraw1
     WPID         : 4008
     Codename     : M175
     Kind         : mouse
     Protocol     : HID++ 2.0
     Polling rate : 8 ms (125Hz)
     Serial number: 1523B10B
     The power switch is located on the base.
     Battery: unknown (device is offline).

  2: Wireless Keyboard K360
     Device path  : /dev/hidraw2
     WPID         : 4004
     Codename     : K360
     Kind         : keyboard
     Protocol     : HID++ 2.0
     Polling rate : 20 ms (50Hz)
     Serial number: 334AC01A
     Model ID:      000000000000
     Unit ID:       00000000
          Firmware: RQK 36.00.B0007
     The power switch is located on the top case.
     Supports 12 HID++ 2.0 features:
         0: ROOT                   {0000}   
         1: FEATURE SET            {0001}   
         2: DEVICE FW VERSION      {0003}   
            Firmware: Firmware RQK 36.00.B0007 4004
            Unit ID: 00000000  Model ID: 000000000000  Transport IDs: {}
         3: DEVICE NAME            {0005}   
            Name: Wireless Keyboard K360
            Kind: keyboard
         4: BATTERY STATUS         {1000}   
            Battery: 70%, discharging, next level 20%.
         5: unknown:1820           {1820}   hidden
         6: REPROG CONTROLS        {1B00}   
         7: WIRELESS DEVICE STATUS {1D4B}   
         8: REMAINING PAIRING      {1DF0}   hidden
            Remaining Pairings: 55
         9: unknown:1DF3           {1DF3}   hidden
        10: FN INVERSION           {40A0}   
            Swap Fx function (saved): False
            Swap Fx function        : False
        11: ENCRYPTION             {4100}   
     Battery: 70%, discharging, next level 20%.

  3: Wireless Mouse MX Master
     Device path  : /dev/hidraw3
     WPID         : 4071
     Codename     : MX Master
     Kind         : mouse
     Protocol     : HID++ 4.5
     Polling rate : 8 ms (125Hz)
     Serial number: D3596818
     Model ID:      B01E40710000
     Unit ID:       9803B76B
        Bootloader: BOT 56.10.B0005
          Firmware: MPM 12.10.B0005
          Firmware: MPM 12.10.B0005
             Other: 
     The power switch is located on the base.
     Supports 31 HID++ 2.0 features:
         0: ROOT                   {0000}   
         1: FEATURE SET            {0001}   
         2: DEVICE FW VERSION      {0003}   
            Firmware: Bootloader BOT 56.10.B0005 40717622661101
            Firmware: Firmware MPM 12.10.B0005 B01E7622661101
            Firmware: Firmware MPM 12.10.B0005 40717622661101
            Firmware: Other   
            Unit ID: 9803B76B  Model ID: B01E40710000  Transport IDs: {'btleid': 'B01E', 'wpid': '4071'}
         3: DEVICE NAME            {0005}   
            Name: Wireless Mouse MX Master
            Kind: mouse
         4: WIRELESS DEVICE STATUS {1D4B}   
         5: RESET                  {0020}   
         6: CRYPTO ID              {0021}   
         7: BATTERY STATUS         {1000}
            Battery: N/A, recharging, next level 0%.
         8: CONFIG DEVICE PROPS    {1806}   internal, hidden
         9: CHANGE HOST            {1814}   
            Change Host        : 2:rachel
        10: REPROG CONTROLS V4     {1B04}   
            DPI Sliding Adjustment (saved): Off
            DPI Sliding Adjustment        : Off
            Mouse Gestures (saved): Off
            Mouse Gestures        : Off
            Key/Button Actions (saved): {Left Button:Left Click, Right Button:Right Click, Middle Button:Mouse Middle Button, Back Button:Mouse Back Button, Forward Button:Mouse Forward Button, Mouse Gesture Button:Gesture Button Navigation, Smart Shift:Smart Shift}
            Key/Button Actions        : {Left Button:Left Click, Right Button:Right Click, Middle Button:Mouse Middle Button, Back Button:Mouse Back Button, Forward Button:Mouse Forward Button, Mouse Gesture Button:Gesture Button Navigation, Smart Shift:Smart Shift}
            Key/Button Diversion (saved): {Middle Button:Regular, Back Button:Regular, Forward Button:Regular, Mouse Gesture Button:Regular, Smart Shift:Regular}
            Key/Button Diversion        : {Middle Button:Regular, Back Button:Regular, Forward Button:Regular, Mouse Gesture Button:Regular, Smart Shift:Regular}
        11: ADJUSTABLE DPI         {2201}   
            Sensitivity (DPI) (saved): 1000
            Sensitivity (DPI)        : 1000
        12: VERTICAL SCROLLING     {2100}   
            Roller type: 3G
            Ratchet per turn: 24
            Scroll lines: 0
        13: SMART SHIFT            {2110}   
            Scroll Wheel Rachet (saved): 10
            Scroll Wheel Rachet        : 10
        14: HIRES WHEEL            {2121}   
            Multiplier: 8
            Has invert: Normal wheel motion
            Has ratchet switch: Normal wheel mode
            High resolution mode
            HID notification
            Scroll Wheel Direction (saved): False
            Scroll Wheel Direction        : False            Scroll Wheel Resolution (saved): True
            Scroll Wheel Resolution        : True
            Scroll Wheel Diversion (saved): False
            Scroll Wheel Diversion        : False
        15: GESTURE 2              {6501}   
            Gestures (saved): {45: True, 46: True}
            Gestures        : {46: True, 45: True}
            Gestures Diversion (saved): {46: False}
            Gestures Diversion        : {46: False}
        16: DFUCONTROL SIGNED      {00C2}   
        17: unknown:1813           {1813}   internal, hidden
        18: unknown:1830           {1830}   internal, hidden
        19: unknown:1890           {1890}   internal, hidden
        20: unknown:1891           {1891}   internal, hidden
        21: unknown:18A1           {18A1}   internal, hidden
        22: unknown:18C0           {18C0}   internal, hidden
        23: unknown:1DF3           {1DF3}   internal, hidden
        24: unknown:1E00           {1E00}   hidden
        25: unknown:1EB0           {1EB0}   internal, hidden
        26: unknown:1803           {1803}   internal, hidden
        27: unknown:1861           {1861}   internal, hidden
        28: unknown:9001           {9001}   internal, hidden
        29: unknown:9200           {9200}   internal, hidden
        30: unknown:9202           {9202}   internal, hidden
     Has 8 reprogrammable keys:
         0: Left Button               , default: Left Click                  => Left Click                
             mse, pos:0, group:1, group mask:g1
             reporting: default
         1: Right Button              , default: Right Click                 => Right Click               
             mse, pos:0, group:1, group mask:g1
             reporting: default
         2: Middle Button             , default: Mouse Middle Button         => Mouse Middle Button       
             mse, reprogrammable, divertable, raw XY, pos:0, group:3, group mask:g1,g2,g3
             reporting: default
         3: Back Button               , default: Mouse Back Button           => Mouse Back Button
             mse, reprogrammable, divertable, raw XY, pos:0, group:2, group mask:g1,g2
             reporting: default
         4: Forward Button            , default: Mouse Forward Button        => Mouse Forward Button      
             mse, reprogrammable, divertable, raw XY, pos:0, group:2, group mask:g1,g2
             reporting: default
         5: Mouse Gesture Button      , default: Gesture Button Navigation   => Gesture Button Navigation 
             mse, reprogrammable, divertable, raw XY, pos:0, group:3, group mask:g1,g2,g3
             reporting: default
         6: Smart Shift               , default: Smart Shift                 => Smart Shift               
             mse, reprogrammable, divertable, raw XY, pos:0, group:3, group mask:g1,g2,g3
             reporting: default
         7: Virtual Gesture Button    , default: Virtual Gesture Button      => Virtual Gesture Button    
             divertable, virtual, raw XY, force raw XY, pos:0, group:4, group mask:empty
             reporting: default
     Has 2 gesture(s), 0 param(s) and 4 spec(s):
        Thumbwheel                 Enabled(   0): True   Diverted:(   0) False
        NaturalScrolling           Enabled(   1): True   Diverted:(None) None
        period unit                Spec   (   3): 800
        DVI field width            Spec   (   1): 8
        field widths               Spec   (   2): 8
        resolution                 Spec   (   4): 2048
     Battery: N/A, recharging, next level 0%.

  4: Performance Mouse MX
     Device path  : /dev/hidraw4
     WPID         : 101A
     Codename     : Performance MX
     Kind         : mouse
     Protocol     : HID++ 1.0
     Polling rate : 8 ms (125Hz)
     Serial number: B65347AA
     The power switch is located on the base.
     Battery: unknown (device is offline).
```
</details>

- Contents of `~/.config/solaar/config.yaml` (or `~/.config/solaar/config.json` if `~/.config/solaar/config.yaml` not present):

<details>

```
- 1.1.4
- {_NAME: Performance Mouse MX, _serial: B65347AA, _wpid: 101A, dpi: '143', side-scroll: true, smooth-scroll: true}
- _NAME: Wireless Keyboard K360
  _absent: [hi-res-scroll, lowres-scroll-mode, hires-smooth-invert, hires-smooth-resolution, hires-scroll-mode, smart-shift, thumb-scroll-invert, thumb-scroll
-mode,
    onboard_profiles, report_rate, pointer_speed, dpi, dpi-sliding, speed-change, mouse-gestures, backlight, backlight-timed, reprogrammable-keys, persistent-
remappable-keys,
    divert-keys, disable-keyboard-keys, crown-smooth, divert-crown, divert-gkeys, m-key-leds, mr-key-led, multiplatform, change-host, gesture2-gestures,
    gesture2-divert, gesture2-params, sidetone, equalizer]
  _modelId: '000000000000'
  _serial: 334AC01A
  _unitId: '00000000'
  _wpid: '4004'
  fn-swap: false
- {_NAME: Wireless Mouse M175, _serial: 1523B10B, _wpid: '4008'}
- {_NAME: M585/M590, _serial: 51B3C62E, _wpid: 406B}
- _NAME: Wireless Mouse MX Master
  _absent: [hi-res-scroll, lowres-scroll-mode, thumb-scroll-invert, thumb-scroll-mode, onboard_profiles, report_rate, pointer_speed, speed-change, backlight,
    backlight-timed, fn-swap, persistent-remappable-keys, disable-keyboard-keys, crown-smooth, divert-crown, divert-gkeys, m-key-leds, mr-key-led, multiplatfo
rm,
    gesture2-params, sidetone, equalizer]
  _modelId: B01E40710000
  _sensitive: {hires-smooth-resolution: true, smart-shift: true}
  _serial: D3596818
  _unitId: 9803B76B
  _wpid: '4071'
  change-host: null
  divert-keys: {82: 0, 83: 0, 86: 0, 195: 0, 196: 0}
  dpi: 1000
  dpi-sliding: 0
  gesture2-divert: {46: false}
  gesture2-gestures: {45: true, 46: true}
  hires-scroll-mode: false
  hires-smooth-invert: false
  hires-smooth-resolution: true
  mouse-gestures: 0
  reprogrammable-keys: {80: 80, 81: 81, 82: 82, 83: 83, 86: 86, 195: 195, 196: 196}
  smart-shift: 10
```
</details>


- Errors or warrnings from Solaar:
<!-- Under normal operation Solaar keeps a log of warning and error messages in ~/.tmp
while it is running as a file starting with 'Solaar'.
If this file is not available or does not have useful information you can
run Solaar as `solaar -dd`, after killing any running Solaar processes to
have Solaar log informational, warning, and error messages to stdout. -->
No obvious error messages!


**Describe the bug**
The minimum vertical size for the main window is too large to be accommodated on a laptop with a 1280x800 screen size and since the "options" on the right hand size are not in a "ScrollArea" it is not possible to reduce the height of the whole dialogue (which might otherwise "activate" a vertical scroll bar to give access to the last few controls) to a point where the "Quit Solaar"/"About Solaar"/"Rule Editor" buttons are visible.

**To Reproduce**
Steps to reproduce the behaviour:
1. Start Solaar on a unit which has a (limited) desktop height of 800
2. Select a device that has a lot of options (e.g. a "Master" mouse)
3. Maximise the UI - at least in the vertical direction (in some DE cases this can be done by dragging the title bar to the top of the screen)
4. See that the bottom of the UI is off the screen (or is hidden behind a system taskbar) and that it is not possible to see the buttons, including the "Quit" one.

**Screenshots**
If applicable, add screenshots to help explain your problem.
![image](https://user-images.githubusercontent.com/6163092/187157320-32553c9e-cb76-4e97-af57-050994be6030.png)

**Additional context**
Add any other context about the problem here.



Discussion:
PR #1725 allows the config panel to scroll.  Try it out and see whether it solves your problem.

To clone and use Solar from its GitHub repository
```
git clone https://github.com/pwr-Solaar/Solaar.git
cd Solaar
```
Run Solaar as bin/solaar from this directory.


To run PR #1725, first clone Solaar if you have not already done so and cd to the clone directory.  The first time you download the pull request, fetch it into a new branch and checkout that branch, as in:
```
git fetch origin pull/1725/head:pull_1725
git checkout pull_1725
```
To download a new version of the pull request, fetch it and then set your pull branch to the new fetch, as in:
```
git checkout pull_1725
git fetch origin pull/1725/head
git reset --hard FETCH_HEAD
```


Resolving patch:
diff --git a/lib/solaar/ui/config_panel.py b/lib/solaar/ui/config_panel.py
--- a/lib/solaar/ui/config_panel.py
+++ b/lib/solaar/ui/config_panel.py
@@ -629,7 +629,14 @@ def create():
     assert _box is None
     _box = Gtk.VBox(homogeneous=False, spacing=8)
     _box._last_device = None
-    return _box
+
+    config_scroll = Gtk.ScrolledWindow()
+    config_scroll.add(_box)
+    config_scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
+    config_scroll.set_shadow_type(Gtk.ShadowType.IN)
+    config_scroll.set_size_request(0, 350)  # ask for enough vertical space for about eight settings
+
+    return config_scroll
 
 
 def update(device, is_online=None):


Test patch: