in sample/src/main/kotlin/org/jetbrains/desktop/sample/linux/SkikoSampleLinux.kt [393:563]
fun onKeyDown(
event: Event.KeyDown,
app: Application,
window: Window,
windowState: WindowState,
modifiers: Set<KeyModifiers>,
clipboardHandler: ClipboardHandler,
): EventHandlerResult {
val shortcutModifiers = modifiers.shortcutModifiers()
when (shortcutModifiers) {
setOf(KeyModifiers.Logo) -> EventHandlerResult.Continue
setOf(KeyModifiers.Control, KeyModifiers.Shift) -> when (event.keyCode.value) {
KeyCode.V -> {
clipboardHandler.paste(listOf(PNG_MIME_TYPE, URI_LIST_MIME_TYPE, TEXT_MIME_TYPE))
EventHandlerResult.Stop
}
KeyCode.C -> {
clipboardHandler.copy(DataTransferContentType.UriList(EXAMPLE_FILES))
EventHandlerResult.Stop
}
KeyCode.O -> {
window.showOpenFileDialog(
commonParams = FileDialog.CommonDialogParams(
modal = false,
title = "Open Directory",
acceptLabel = null,
currentFolder = null,
),
openParams = FileDialog.OpenDialogParams(
allowsMultipleSelections = false,
selectDirectories = true,
),
)
EventHandlerResult.Stop
}
else -> EventHandlerResult.Continue
}
setOf(KeyModifiers.Control) -> when (event.keyCode.value) {
KeyCode.V -> {
clipboardHandler.paste(listOf(PNG_MIME_TYPE, TEXT_MIME_TYPE, URI_LIST_MIME_TYPE))
EventHandlerResult.Stop
}
KeyCode.C -> {
getCurrentSelection()?.let { selection ->
clipboardHandler.copy(DataTransferContentType.Text(selection))
EventHandlerResult.Stop
} ?: EventHandlerResult.Continue
}
KeyCode.O -> {
window.showOpenFileDialog(
commonParams = FileDialog.CommonDialogParams(
modal = true,
title = "Open Files",
acceptLabel = null,
currentFolder = null,
),
openParams = FileDialog.OpenDialogParams(
allowsMultipleSelections = true,
selectDirectories = false,
),
)
EventHandlerResult.Stop
}
KeyCode.M -> {
window.startMove()
EventHandlerResult.Stop
}
KeyCode.Tab -> {
window.requestInternalActivationToken()
EventHandlerResult.Stop
}
else -> EventHandlerResult.Continue
}
setOf(KeyModifiers.Shift) -> when (event.keyCode.value) {
KeyCode.Up -> {
if (selectionStartOffset == null) {
selectionStartOffset = cursorOffset
}
selectionEndOffset = 0
cursorOffset = 0
}
KeyCode.Down -> {
if (selectionStartOffset == null) {
selectionStartOffset = cursorOffset
}
val end = text.length
selectionEndOffset = end
cursorOffset = end
}
KeyCode.Left -> {
if (selectionStartOffset == null) {
selectionStartOffset = cursorOffset
}
cursorOffset = getPreviousGlyphOffset(text.toString(), cursorOffset)
selectionEndOffset = cursorOffset
}
KeyCode.Right -> {
if (selectionStartOffset == null) {
selectionStartOffset = cursorOffset
}
cursorOffset = getNextGlyphOffset(text.toString(), cursorOffset)
selectionEndOffset = cursorOffset
}
else -> {
event.characters?.also(::typeIn)
}
}
else -> when (event.keyCode.value) {
KeyCode.BackSpace -> {
if (!deleteSelection() && cursorOffset > 0) {
val newCursorOffset = getPreviousGlyphOffset(text.toString(), cursorOffset)
text.delete(newCursorOffset, cursorOffset)
cursorOffset = newCursorOffset
}
}
KeyCode.F11 -> {
if (windowState.fullscreen) {
window.unsetFullScreen()
} else {
window.setFullScreen()
}
}
KeyCode.Up -> {
cursorOffset = 0
}
KeyCode.Down -> {
cursorOffset = text.length
}
KeyCode.Left -> {
cursorOffset = getPreviousGlyphOffset(text.toString(), cursorOffset)
}
KeyCode.Right -> {
cursorOffset = getNextGlyphOffset(text.toString(), cursorOffset)
}
else -> {
event.characters?.also(::typeIn)
}
}
}
if (shortcutModifiers.all { it != KeyModifiers.Shift && it != KeyModifiers.Control && it != KeyModifiers.Logo } &&
!event.keyCode.isModifierKey()
) {
selectionStartOffset = null
selectionEndOffset = null
}
if (textInputEnabled) {
app.textInputUpdate(createTextInputContext(changeCausedByInputMethod = false))
}
return EventHandlerResult.Stop
}