zmkfirmware / zmk

ZMK Firmware Repository
https://zmk.dev/
MIT License
2.48k stars 2.56k forks source link

feat(ble): Fast switching between two recent profiles #2278

Open Dimentium opened 2 months ago

Dimentium commented 2 months ago

related to #767

I'm not a developer, so this implementation is quite basic, but it works perfectly for me.

This update introduces the ability to switch back to the previously active bluetooth profile by passing index 255 to the profile selection function. This feature facilitates quick toggling between two frequently used Bluetooth devices.

huber-th commented 2 months ago

This is a great idea. I personally switch between two profiles a lot and can see the benefit of being able to only use a single key binding on the base layer rather than having to have two key bindings to swap between profiles.

I would recommend to add a new command, e.g. &bt BT_ALT (short for alternate), instead of using &bt BT_SEL 255 for this.

You could also extend the code to ensure the previous profile is persisted along side the active profile, so that swapping also works directly after startup.

Dimentium commented 2 months ago

Hi @caksoylar, Is there anything I need to do with this MR?

caksoylar commented 2 months ago

I am not making the merge decision for this, but I don't see this being useful without the alias BT_ALT like @huber-th suggested. Then it also needs to be documented.

huber-th commented 2 months ago

@Dimentium I really love the idea of this feature, especially since I switch between two profiles frequently.

Since you mentioned that you're not a developer, I'd be happy to implement the improvements I suggested above as well as document the feature. We can then review the changes together.

What do you think?

Nick-Munnich commented 1 month ago

1413 is meant to implement the same thing, but a more recent implementation would be good. I like the naming used there though, BT_LAST_DEV.

huber-th commented 1 month ago

I implemented this feature over the weekend for myself, including persisting both profiles to ensure alternating works immediately after startup. You can find the code here. Feel free to copy code as you see fit @Dimentium or I can also create a new PR.

For completeness, the goal of only needing a single key binding to switch between BT profiles can also be achieved using tap-dance.

  behaviors {
    td_bt: tap_dance_bluetooth {
        compatible = "zmk,behavior-tap-dance";
        #binding-cells = <0>;
        tapping-term-ms = <500>;
        bindings = <&bt BT_SEL X>, <&bt BT_SEL Y>;
    };
  };