Skip to content

Support Knob controllers and route them to setImage rendering

Choose a tag to compare

@JKWTCN JKWTCN released this 29 Jun 15:45

Add support for "Knob" controllers (e.g. StreamDock/HotSpot) alongside
the existing Stream Deck+ "Encoder". Previously the plugin only treated
the "Encoder" controller type as an encoder, so Knob devices fell
through to the keypad path and could not use the encoder canvas and
dial/touch command handling.

The core challenge is that both controller types need encoder-like
rendering (200x100 canvas, dial/touch commands), but they deliver images
to the host differently:

  • Stream Deck+ "Encoder": renders via a layout + setFeedback (the
    "canvas" pixmap item defined in layout-pilotsdeck.json).
  • "Knob" (StreamDock/HotSpot): does NOT implement the layout feedback
    mechanism and must receive the full image via setImage.

Changes:

  • AppConfiguration: add the "Knob" controller constant and two helpers:
    • IsControllerEncoder() -> true for "Encoder" OR "Knob"
    • IsControllerFeedbackEncoder() -> true ONLY for "Encoder" (layout)
  • StreamDeckCanvasInfo: add UsesFeedbackLayout flag, populated in
    GetInfo() from IsControllerFeedbackEncoder().
  • ActionBaseSimple / ActionMeta: derive IsEncoder from the new
    IsControllerEncoder() helper so Knob devices share the encoder canvas
    and command pipeline.
  • ActionManager.Redraw: only take the setFeedback layout branch when
    IsEncoder && UsesFeedbackLayout; otherwise (keypad and Knob) push the
    rendered image directly with setImage.
  • manifest.json: add "Knob" to the Controllers list of the seven actions
    that already support Encoder, and normalize the trailing newline.