Support Knob controllers and route them to setImage rendering
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.