darkly 0.5.0

A GPU-native paint engine on wgpu: brushes, layers, blend modes, masks, selections, and undo.
Documentation
# GIMP overlay. Carries every binding where GIMP's choice differs from
# at least one other reference editor, plus Darkly fallbacks for actions
# where GIMP has no opinion but some other editor does. Unanimous
# bindings live in defaults.yaml; see the rule in defaults.yaml.
name: GIMP
description: GIMP-style keybindings

hotkeys:
  # Edit / clipboard (non-unanimous slice).
  # GIMP binds Redo to <primary>Y; <primary><shift>Z is "Strong Undo".
  # See gimp/app/actions/edit-actions.c.
  redo: $mod+KeyY
  # GIMP's edit-paste-in-place is <primary><alt>V (NOT <shift>V).
  # See gimp/app/actions/edit-actions.c.
  pasteInPlace: $mod+Alt+KeyV
  # GIMP has no native Preferences hotkey. Fall through to Darkly's pick.
  openSettings: $mod+Comma
  # GIMP binds File > Export As… to <primary><shift>E (see
  # gimp/app/actions/file-actions.c — `file-export-as`).
  exportImage: $mod+Shift+KeyE
  # mirrorViewH: intentionally unbound. GIMP has no native mirror-view
  # hotkey, and Krita's M would set no established GIMP-user expectation
  # — leave it for explicit user binding rather than invent a default.
  # Tools.
  brushTool: KeyP
  fillTool: Shift+KeyB
  gradientTool: KeyG
  colorPickerTool: KeyO
  rectSelectTool: KeyR
  ellipseSelectTool: KeyE
  magicWandTool: KeyU
  transformTool: KeyT
  toggleEraseMode: Shift+KeyE
  # GIMP's "Free Select" tool is the closest analog to Lasso — it handles
  # both free-form and polygonal segments via mode within one tool.
  # Registered with `F` in gimp/app/tools/gimpfreeselecttool.c
  # (`gimp_free_select_tool_register`). polygonSelectTool is left unbound
  # because GIMP has no separate polygonal tool.
  lassoSelectTool: KeyF
  # Layers.
  isolateLayer: KeyI
  # GIMP's layers-delete action has no global accelerator (its accel slot is
  # { NULL } in layers-actions.c); `Delete` deletes the active layer only when
  # the Layers panel has focus.
  deleteLayer: layerPanel:Delete
  # GIMP binds Layer > Duplicate Layer(s) to Ctrl+Shift+D.
  duplicateLayer: $mod+Shift+KeyD
  # GIMP's "New Layer…" is bound to Ctrl+Shift+N (layers-actions.c).
  newLayer: $mod+Shift+KeyN
  # GIMP's `layers-new-group` has no global accelerator (layers-actions.c
  # accel slot is { NULL }). Fall through to PS+Krita's Ctrl+G; this
  # doesn't collide with any GIMP-side binding.
  newGroup: $mod+KeyG
  # GIMP's `layers-merge-down` has no global accelerator either; GIMP's
  # only layer-merge default is Ctrl+M for "Merge Visible Layers" — a
  # different op. Fall through to PS+Krita's Ctrl+E.
  mergeDown: $mod+KeyE
  # Selection.
  clearSelection: $mod+Shift+KeyA
  # GIMP binds Select > Invert to Ctrl+I. This is why `adjustInvert` (Colors >
  # Invert) is intentionally left unbound for GIMP: Colors > Invert ships no
  # default key, and Ctrl+I is taken here. Krita/PS put invert-colors on Ctrl+I;
  # GIMP keeps Ctrl+I for invert-selection.
  invertSelection: $mod+KeyI

mouse_clicks:
  # GIMP's "Sample colour into the foreground swatch" (temporary Color Picker)
  # is Ctrl+click on paint tools — Cmd+click on macOS, via GTK's `<primary>`
  # modifier role. Darkly uses drag (continuous sample while held) instead of
  # click; `$mod` carries the platform swap.
  sampleColor: canvas@paint:$mod+drag
  # isolateLayer mouse_click: GIMP has no thumbnail-modifier equivalent,
  # so intentionally unbound here. The hotkey form (KeyI above) is the
  # GIMP-native path.

settings:
  tools.colorPickerSampleSource: merged