# HG changeset patch # User sam # Date 1742578513 -25200 # Node ID 4a06e29d1a274eb46d362f7a2c64603670f417b8 # Parent eaad5e0443f8a0e87f28e67b725866c37f25154e did: fix input handling somewhat, changing input method on linux not really working... diff -r eaad5e0443f8 -r 4a06e29d1a27 semicongine/input.nim --- a/semicongine/input.nim Fri Mar 21 18:16:24 2025 +0700 +++ b/semicongine/input.nim Sat Mar 22 00:35:13 2025 +0700 @@ -6,7 +6,10 @@ import ./rendering import ./storage -proc updateInputs*(): bool = +proc updateInputs*(readChars: bool = false): bool = + # in order to prevent key-events to generate while the program + # is reading text-input from the keyboard, set `readChars` to true + # reset input states engine().input.keyWasPressed = {} engine().input.keyWasReleased = {} @@ -25,6 +28,9 @@ else: engine().input.mousePosition = newMousePos + proc isControlChar(r: Rune): bool = + (0x00'i32 <= int32(r) and int32(r) <= 0x1F'i32) or int(r) == 0x7f + var killed = false for event in engine().vulkan.window.pendingEvents(): case event.eventType @@ -33,14 +39,16 @@ of ResizedWindow: engine().input.windowWasResized = true of KeyPressed: - engine().input.keyWasPressed.incl event.key - engine().input.keyIsDown.incl event.key # exclude control characters for text input - if not (0x00'i32 <= int32(event.char) and int32(event.char) <= 0x1F'i32): + if readChars and not event.char.isControlChar(): engine().input.characterInput = event.char + else: + engine().input.keyWasPressed.incl event.key + engine().input.keyIsDown.incl event.key of KeyReleased: - engine().input.keyWasReleased.incl event.key - engine().input.keyIsDown.excl event.key + if not readChars or event.char.isControlChar(): + engine().input.keyWasReleased.incl event.key + engine().input.keyIsDown.excl event.key of MousePressed: engine().input.mouseWasPressed.incl event.button engine().input.mouseIsDown.incl event.button diff -r eaad5e0443f8 -r 4a06e29d1a27 semicongine/text.nim --- a/semicongine/text.nim Fri Mar 21 18:16:24 2025 +0700 +++ b/semicongine/text.nim Sat Mar 22 00:35:13 2025 +0700 @@ -37,9 +37,9 @@ current.add c yield current -proc width*(font: Font, text: seq[Rune]): float32 = +proc width*(font: Font, text: seq[Rune], withTrailingWhiteSpace = false): float32 = for i in 0 ..< text.len: - if not (i == text.len - 1 and text[i].isWhiteSpace): + if i < text.len - 1 or not text[i].isWhiteSpace or withTrailingWhiteSpace: if text[i] in font.advance: result += font.advance[text[i]] else: @@ -48,20 +48,29 @@ result += font.kerning.getOrDefault((text[i], text[i + 1]), 0) return result -proc width*(font: Font, text: string): float32 = - width(font, text.toRunes) +proc width*(font: Font, text: string, withTrailingWhiteSpace = false): float32 = + width(font, text.toRunes, withTrailingWhiteSpace = withTrailingWhiteSpace) -proc textDimension*(font: Font, text: seq[Rune]): Vec2f = +proc textDimension*( + font: Font, text: seq[Rune], withTrailingWhiteSpace = false +): Vec2f = let nLines = text.countIt(it == Rune('\n')).float32 let h = (nLines * font.lineAdvance + font.lineHeight) - let w = max(splitLines(text).toSeq.mapIt(width(font, it))) + let w = max( + splitLines(text).toSeq.mapIt( + width(font, it, withTrailingWhiteSpace = withTrailingWhiteSpace) + ) + ) return vec2(w, h) -proc textDimension*(font: Font, text: string): Vec2f = - textDimension(font, text.toRunes()) +proc textDimension*(font: Font, text: string, withTrailingWhiteSpace = false): Vec2f = + textDimension(font, text.toRunes(), withTrailingWhiteSpace = withTrailingWhiteSpace) -proc textDimension*(textBuffer: TextBuffer, text: string | seq[Rune]): Vec2f = - textDimension(textBuffer.font, text) * textBuffer.baseScale +proc textDimension*( + textBuffer: TextBuffer, text: string | seq[Rune], withTrailingWhiteSpace = false +): Vec2f = + textDimension(textBuffer.font, text, withTrailingWhiteSpace = withTrailingWhiteSpace) * + textBuffer.baseScale proc updateGlyphData*(textbuffer: var TextBuffer, textHandle: TextHandle) = assert textHandle.generation == textbuffer.generation